我遇到了以"多对多"关系保存数据的麻烦.
这是我的模特:
var CoursePeople = bookshelf.Model.extend({
tableName: 'course_people'
});
var Course = bookshelf.Model.extend({
tableName: 'course',
users: function(){
return this.belongsToMany(User);
}
});
var City = bookshelf.Model.extend({
tableName: 'city',
users: function(){
return this.hasMany(User);
}
});
var User = bookshelf.Model.extend({
tableName: 'people',
city: function(){
return this.belongsTo(City);
},
courses: function(){
return this.belongsToMany(Course);
}
});
Run Code Online (Sandbox Code Playgroud)
挑战是,如何将我在数组中获取的ID插入到我的数据库中的联结表(名为"course_people")?
到目前为止,这是我的代码:
app.post('/users/', function(req, res) {
console.log(req.body);
var courses_ids = req.body.courses_ids; //array of ids
delete req.body.courses_ids;
new User(req.body).save().then(function(user){
console.log(user.id);
//How to store the ids in the junction table?
}).catch(function(error){
console.log(error); …Run Code Online (Sandbox Code Playgroud) Angular 2的大多数选择/选项解决方案的工作方式是返回实际内容,而不是value属性.但是,因为我还在学习Angular 2,所以我希望获得value点击按钮的实际属性.我设法在某种程度上解决了这个问题,但我不确定这是否是正确的方法.以下是我希望它如何工作的示例:
<select #selectedCategory>
<option *ngFor="#category of categories" [value]="category.id">{{category.name}}</option>
</select>
<button (click)="getValueFromSelect(selectedCategory.value)">
/* This returns the selected category.name, not the value attribute. */
Run Code Online (Sandbox Code Playgroud)
上面的解决方案创建了以下HTML(请注意缺少value属性option):
<select _ngcontent-oom-3="">
<!--template bindings={}-->
<option _ngcontent-oom-3="">stuff 1</option>
<option _ngcontent-oom-3="">stuff 2</option>
<option _ngcontent-oom-3="">stuff 3</option>
</select>
Run Code Online (Sandbox Code Playgroud)
下面的解决方案实际上是有效的,但是,我需要一个ngModel以使其工作.
<select [(ngModel)]="selectedCategory">
<option *ngFor="#category of categories" [value]="category.id">{{category.name}}</option>
</select>
<button (click)="getValueFromSelect(selectedCategory.value)">
/* This returns the value attribute correctly; however, do I really need a ngModel for one value? */
Run Code Online (Sandbox Code Playgroud)
解决这种情况的正确方法是什么?
谢谢你的建议.
我正在使用Multer模块上传文件.虽然一切正常但是在github页面的末尾有一个警告,上面写着:"警告:文件上传完成后req.body被完全解析.过早访问req.body可能会导致错误."
这让我非常担心.我找不到让.post中间件知道何时上传文件并且req.body准备好使用的方法.这是我的代码:
app.js:
app.use(multer({
dest: './uploads/',
rename: function (fieldname, filename) {
return filename.replace(/\W+/g, '-').toLowerCase() + Date.now();
},
putSingleFilesInArray: true
})
);
Run Code Online (Sandbox Code Playgroud)
upload.js:
router.route('/')
.get(function(req, res){
res.render('uploads');
})
.post(function(req, res){
//how to wait here for the file to upload?
});
Run Code Online (Sandbox Code Playgroud)
虽然我知道onParseEnd,但我不知道如何实现它,所以我至少有一些关于上传过程的信息.
我试图查询该属性,该属性是对另一个架构的引用和一些其他数据的数组。为了更好的说明,以下是模式:
var orderSchema = new Schema({
orderDate: Date,
articles: [{
article: {
type: Schema.Types.ObjectId,
ref: 'Article'
},
quantity: 'Number'
}]
}),
Order = mongoose.model('Order', orderSchema);
Run Code Online (Sandbox Code Playgroud)
虽然我成功地查询了引用,即:
Order.find({}).populate('articles.article', null, {
price: {
$lte: 500
}
}).exec(function(err, data) {
for (var order of data) {
for (var article of order.articles) {
console.log(article);
}
}
});
Run Code Online (Sandbox Code Playgroud)
我在查询quantity属性时遇到了一些问题,即这不起作用:
Order.find({}).where({
'articles.quantity': {
$gte: 5
}
}).populate('articles.article', null, {
/*price: {
$lte: 500
}*/
}).exec(function(err, data) {
for (var order of data) {
for …Run Code Online (Sandbox Code Playgroud) mongoose mongodb node.js mongodb-query aggregation-framework
基本上,我问过昨天重复使用来自可观察数据的数据,然后我也在其他地方问过并阅读了一些,然后我想,为什么不只是持有一个observable并用map操作符操纵数据.
所以我只做一个HTTP请求,将observable存储到某个变量并在那里操作它.代码有效,但我不确定我.publishReplay(1).refCount()是否使用正确,或者我应该使用connect?或者,我甚至需要这些吗?此外,是否有任何可能的内存泄漏可能来自此服务?
这是服务代码:
@Injectable()
export class UsersApiService {
private readonly baseUrl: string = 'https://reqres.in/api/users';
resource$: Observable<any>;
constructor(private http: HttpClient) {
this.resource$ = this.http.get<IUserDetails[]>(this.baseUrl).pipe(
tap((data) => {
console.log('"getUsers" successfully called!');
}),
map((data: any) => {
return data.data;
})
).publishReplay(1).refCount();
}
getUsers(): Observable<IUser[]> {
return this.resource$.pipe(
map((data: IUserDetails[]) => {
return <IUser[]>data.map((u) => {
return {
id: u.id,
name: `${u.first_name} ${u.last_name}`
};
});
})
);
}
getUserById(id: number): Observable<IUserDetails> {
return this.resource$.pipe(
map((data) => …Run Code Online (Sandbox Code Playgroud) 我目前使用 Dexie.js 在本地存储数据。我有 3 个不同的表,它们通过使用外键相互连接。我设法设置了架构并插入了相应的数据。但是,当我要检索数据时,却找不到如何连接不同表的示例。
下面是一个例子:
var db = new Dexie('my-testing-db');
db.delete().then(function() {
db.version(1).stores({
genres: '++id,name',
albums: '++id,name,year,*tracks',
bands: '++id,name,*albumsId,genreId'
});
db.transaction('rw', db.genres, db.albums, db.bands, function() {
var rock = db.genres.add({
name: 'rock'
}),
jazz = db.genres.add({
name: 'jazz'
});
var justLookAround = db.albums.add({
name: 'Just Look Around',
year: 1992,
tracks: [
'We want the truth', 'Locomotive', 'Shut me out'
]
});
var sickOfItAll = db.bands.add({
name: 'Sick Of it All'
});
justLookAround.then(function(album_id) {
rock.then(function(rock_id) {
sickOfItAll.then(function(band_id) {
db.bands.update(band_id, { …Run Code Online (Sandbox Code Playgroud) 我大约1年前使用过Karma,一切正常.当我更改测试并保存.test.js文件时,测试自动运行 - 不必重新启动或更改任何内容.今天我想再次运行这些测试.有了一台新电脑,我不得不安装node和npm以及whatnot,然后我也安装了:
npm install -g karma karma-cli karma-jasmine karma-chrome-launcher
我将Karma配置如下(karma init):
// Karma configuration
// Generated on Thu Apr 14 2016 14:50:35 GMT+0200 (Central Europe Summer Time)
module.exports = function(config) {
config.set({
// base path that will be used to resolve all patterns (eg. files, exclude)
basePath: '',
// frameworks to use
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
frameworks: ['jasmine'],
// list of files / patterns to load in the browser
files: [
'js/*.js'
],
// list of files …Run Code Online (Sandbox Code Playgroud) 我刚刚发现valueSELECT的OPTION部分有一个替代属性,即ngValue.文档真的缺乏关于此的文档(我只能找到:https://angular.io/docs/ts/latest/api/forms/index/NgSelectOption-directive.html).无论如何,这个想法是,当你使用一个对象时ngModel,你可以使用ngValue它并且效果很好.否则,仅更新例如ID.如果我们只有一个字符串数组,那么值就足够了.以下是示例:
{{myModel | json}}
<select [(ngModel)]="myModel">
<option *ngFor="let i of items" [ngValue]="i">{{i.value}}</option>
</select>
<br /><br />
{{mySimpleModel}}
<select [(ngModel)]="mySimpleModel">
<option *ngFor="let i of simpleItems" [value]="i">{{i}}</option>
</select>
Run Code Online (Sandbox Code Playgroud)
虽然这可以按预期工作,但两者之间存在明显差异:如果使用ngValue,则不会在下拉列表中选择预定义值,而对于基元类型,则在加载时选择值.例如:
items: any[] = [{id: 1, value: 'item1'}, {id: 2, value: 'item2'}, {id: 3, value: 'item3'}];
myModel: any = {id: this.items[1].id , value: this.items[1].value};
simpleItems: string[] = ['item1', 'item2', 'item3'];
mySimpleModel: string = this.simpleItems[1];
Run Code Online (Sandbox Code Playgroud)
请参阅此处的示例:https://plnkr.co/edit/JBrtmx7QkPZztBjaqYkS ?p = …
我正在将express.js与pdfkit一起使用以生成pdf并将其强制下载给用户。为此,我使用了res.download属于express.js 的函数。我也可以pipe将pdf转换为res,但随后下载将无法开始。
好的,这是我的问题:是否可以通过某种方式在服务器上创建pdf并将其“存储在内存中”或类似的东西?当前,我必须定义一个创建pdf的特定位置,然后从该位置读取并提供给用户。基本上,我想“跳过”保存到磁盘和从磁盘读取的文件,但仍然为用户强制下载。
也许我在这里不理解某些概念,所以不胜感激!
这是代码:
router.get('/pdf/:id', function(req, res) {
Order._getById(req.params.id).
then(function(order) {
if (order !== null) {
var doc = new PDFDocument();
var result = order.toJSON();
var products = result.products;
var user = result.user;
var comments = result.comments;
doc.registerFont('arial', path.join(__dirname, '../fonts', 'arial' , 'arial.ttf'));
for (var i in products) {
var product = products[i];
doc.font('arial').text(product.name);
doc.image(path.join(__dirname,'../uploads','thumb', product.picture), {scale: 1.0});
doc.font('arial').text(product.price + ' €');
}
var r = doc.pipe(fs.createWriteStream(path.join(__dirname, '../uploads', 'out.pdf')));
doc.end();
r.on('finish', function(){
//the …Run Code Online (Sandbox Code Playgroud) 所以,标题非常简单.我想从公司使用Web服务,我得到了.cer和.p12文件.据说,我应该在提出请求时使用.p12.我已将.cer导入windows中,我可以轻松地向邮递员提出请求.但是,当我尝试使用node.js进行请求时,我收到错误.这是代码,我正在使用request模块:
var headersOpt = {
"content-type": "application/json",
};
var options = {
url: 'https://some-url/api',
cert: fs.readFileSync(__dirname + '/certs/myCert.p12'),
headers: headersOpt
};
request.get(options, (error, response, body) => {
console.log(error);
console.log(response);
console.log(body);
});
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
{ Error: error:0906D06C:PEM routines:PEM_read_bio:no start line
at Object.createSecureContext (_tls_common.js:89:17)
at Object.exports.connect (_tls_wrap.js:1048:48)
at Agent.createConnection (https.js:111:22)
at Agent.createSocket (_http_agent.js:224:26)
at Agent.addRequest (_http_agent.js:192:10)
at new ClientRequest (_http_client.js:256:16)
at Object.request (http.js:39:10)
at Object.request (https.js:239:15)
at Request.start (D:\parser\node_modules\request\request.js:748:32)
at Request.end (D:\parser\node_modules\request\request.js:1512:10)
opensslErrorStack:
[ 'error:140DC009:SSL routines:SSL_CTX_use_certificate_chain_file:PEM lib' ] }
Run Code Online (Sandbox Code Playgroud) 正如标题所述,我想知道是否可以在 node.js 中使用promisify(https://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_util_promisify_original)readline?我只能这样做:
let data = [];
const parse = () => {
return new Promise((resolve, reject) => {
const rl = readline.createInterface({
input: fs.createReadStream(path)
});
rl.on('line', (line) => {
data.push(line);
});
rl.on('close', () => {
resolve(data);
});
});
};
Run Code Online (Sandbox Code Playgroud) 我正在使用Geocoder API,当返回结果时,双向数据绑定不起作用.数据不会在视图中刷新.如果我手动更改任何其他属性,数据会刷新...所以,我google(很多)并找到了一个使用的解决方案ngZone.这就是我所做的:
getLocation(address: string): void {
var mygc = new google.maps.Geocoder();
this._ngZone.runOutsideAngular(() => {
mygc.geocode({
'address': address
}, (results, status) => {
var data: any = results[0];
this._ngZone.run(() => {
this.myObject.myData = {
lat: data.geometry.location.lat(),
lng: data.geometry.location.lng()
};
});
});
});
}
Run Code Online (Sandbox Code Playgroud)
所以我有几个问题:
ngZone用?文档很松散......runOutsideAngular()那么好,使用它的重点是什么?该示例还包括此函数调用,因此我也实现了它.但它没有它也可以工作......myObject在视图中还有其他方法可以刷新吗?谢谢!
在服务中我有这个定义:
getAllHTTP(): Observable<IUser[]> {
return this.http.get(`${this.url}/users`)
.map(res => res.json())
.catch(err => Observable.throw(err));
}
Run Code Online (Sandbox Code Playgroud)
在组件中:
ngOnInit() {
const self = this;
this._uService.getAllHTTP().subscribe(
function (data) {
console.log(data);
self.listOfUsers = data
},
(error) => console.error(error)
);
}
Run Code Online (Sandbox Code Playgroud)
所以现在我想在将observable传递给组件之前过滤数据,我这样做了:
getAllHTTP(): Observable<IUser[]> {
return this.http.get(`${this.url}/users`)
.map(res => res.json())
.filter(<IUser>(x) => x.id > 2)
.catch(err => Observable.throw(err));
}
Run Code Online (Sandbox Code Playgroud)
它不起作用.该x滤波器是一个实际的阵列,而不是阵列中的项目.这真的很奇怪,我认为它与RXjs无关,因为它的工作方式与本例中的假设相似:http://jsbin.com/nimejuduso/1/edit?html,js,console,output
所以我做了一些挖掘,显然我应该使用flatMap.好的,我这样做了,取而代之map,flatMap但现在我收到了这个错误:
找不到支持对象'[object Object]'
显然,当我订阅时,我曾经得到一个数组,现在我一次得到一个对象......为什么Angular2表现得那样?或者毕竟这是RXjs?
javascript ×7
angular ×5
node.js ×5
express ×2
rxjs ×2
bookshelf.js ×1
certificate ×1
dexie ×1
karma-runner ×1
mongodb ×1
mongoose ×1
multer ×1
observable ×1
openssl ×1
orm ×1
p12 ×1
promise ×1
ssl ×1