Node.js mongoose如何填充非id字段或如何手动实现并行承诺填充
我想用mongoose填充一个非id字段,在这里已经找到了以下问题: 原来mongoose现在不支持这个功能。这里的公开问题是: 现在,我想手动填充额外的查询。但是我在做这件事时遇到了一些问题 我有两个模式(回复、用户): 这是回复模式,作者id引用的是用户集合的用户名字段,而不是用户idNode.js mongoose如何填充非id字段或如何手动实现并行承诺填充,node.js,mongoose,promise,generator,bluebird,Node.js,Mongoose,Promise,Generator,Bluebird,我想用mongoose填充一个非id字段,在这里已经找到了以下问题: 原来mongoose现在不支持这个功能。这里的公开问题是: 现在,我想手动填充额外的查询。但是我在做这件事时遇到了一些问题 我有两个模式(回复、用户): 这是回复模式,作者id引用的是用户集合的用户名字段,而不是用户id var ReplySchema = new Schema({ 'content' : { type: String, required: true }, 'author_id
var ReplySchema = new Schema({
'content' : {
type: String,
required: true
},
'author_id' : {
type: String,
ref: 'users'
},
});
当我收到全部回复时。比如:
replies [ {
content: 'comments one',
author_id: 'raynlon',
},
{
content: 'comments two',
author_id: 'raynlon',
} ]
从这里开始,我将进一步从用户表中查询作者,我所做的是:
var replies = yield query.exec(); // which already got all the replies
var final = [];
for (var i = 0; i < replies.length; i++) {
co(function*(){
var data = yield User.Model.findOne({username: replies[i].author_id}).select('username email avatar gravatar_id name').exec();
return data;
}).then(function(value) {
final.push(value);
});
}
return final // I need to return the modified data back to the client
var repress=yield query.exec();//已经收到了所有的回复
var final=[];
for(var i=0;i
我总是空着
这是由于for循环中的异步代码造成的
我还找到了一些解决方案,如:
Promise.all(),q.all()
这些类似的承诺
但是我不知道该怎么做
我使用的co库说co()应该作为承诺返回,理论上,我们可以将其注入到promise.all([]),但它不起作用……所以有人能帮我吗 好的,问题是:您创建了变量
final
,并在战后返回它,这发生在Mongo查询执行之前
解决方案:您应该将承诺推送到final
,然后在回复客户时一起解决
函数queryAsync(){
var repress=yield query.exec();//已获得所有回复
var final=[];
for(var i=0;i