所以我试图用风帆中的数据库替换数据中的字段。
async.waterfall( [
function getscores(callback) {
Score.find({course : courseId}).paginate({page : 1 , limit: 10}).populate('course')
.exec(function(err,data) {
callback(null,data);
});
}
, function addUserInfo(result,callback) {
for(var i=0; i < result.length; i++){
result[i].user = User.findOne({id : result[i].user}).exec(function(err,data) {
var temp = {
"name" : data.name,
"id" : data.id,
"user_id" : data.user_id
}
return temp;
});
}
res.json(messageGenerator(200, 'Sucecss', result));
}],function(err) {
console.log(err);
}
);
第一个函数'getScores'返回得分数组,但每个得分属性只有一个用户ID。现在在addUserInfo函数中,我希望能够将用户的名称添加到score属性。
但是上面的代码无法返回内部的用户。得分的用户属性为空。我相信在程序添加用户属性之前已经发送了响应(由于数据库适配器的异步性)。
答案 0 :(得分:0)
在简短的评论聊天之后,addUserInfo
功能的以下替代品可以帮助您实现您的目标:
function addUserInfo(results,callback) {
async.map(results, function(result, callback) {
User.findOne({id : result.user}).exec(function(err, data) {
callback(err, Object.assign(result, {
"user": {
"name" : data.name || null,
"id" : data.id || null,
"user_id" : data.user_id || null
}
}));
});
}, function(err, output) {
return res.json(messageGenerator(200, "Success", output))
});
}
异步映射允许我们异步迭代结果,允许我们通过提供result
和新callback
作为第二个参数来修改result
。 Final函数是我们的最终回调函数,它随之发生的任何err
和我们的新数组output
一起提供。