如何替换帆中数据库返回的一些属性

时间:2016-07-19 10:43:34

标签: javascript node.js sails.js waterline

所以我试图用风帆中的数据库替换数据中的字段。

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属性。

但是上面的代码无法返回内部的用户。得分的用户属性为空。我相信在程序添加用户属性之前已经发送了响应(由于数据库适配器的异步性)。

1 个答案:

答案 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一起提供。