【问题标题】:Node JS + Express + Mongoose not filling array from findByIdNode JS + Express + Mongoose 没有从 findById 填充数组
【发布时间】:2014-11-09 00:43:54
【问题描述】:

我需要通过添加一个用户对象来编辑一个游戏对象。这是由 mongoose 查询 findById 完成的。此查询有效。但是,当我想将修改后的游戏添加到结果数组中时,出现了问题。 'console.log(game);'返回正确的输出,但 'console.log(result);'总是空的。出了什么问题?是不是有内在功能的东西?

            var result = [];
            games.forEach(function(game){
                User.findById(game.user1_id, function(err, user){
                    if(err)
                        console.log(err);
                    game.user1 = user;
                    result.push(game);
                    console.log(game);
                });

            });
            console.log(result);

【问题讨论】:

    标签: node.js express mongoose


    【解决方案1】:

    您遇到了类回调问题。当您在游戏中调用forEach 时,代码实际上将在回调之外继续,因此结果将是您首先分配给它的值,即[]。这是因为代码被异步评估。

    通过将您的代码移动到一个带有回调的函数中来解决这个问题,该回调在循环完成时被调用,如下所示:

    var utils = require('restberry-utils');
    
    var getResult = function(next) {
        var result = [];
        utils.forEachAndDone(games, function(game, iter) {
            User.findById(game.user1_id, function(err, user) {
                if (err)  console.log(err);
                game.user1 = user;
                result.push(game);
                iter();
            });
        }, function() {
            next(result);
        });
    };
    
    getResult(function(result) {
        console.log(result);
    });
    

    请注意,我已经导入了 restberry-utils 包并使用了 forEachAndDone 方法。此方法将遍历对象但不会继续,除非您调用 iter 方法。当它遍历所有对象时,调用最后一个回调,这是我返回结果的地方。

    希望这是有道理的。

    【讨论】:

      猜你喜欢
      • 2019-06-25
      • 1970-01-01
      • 2013-02-03
      • 2017-05-19
      • 2017-09-25
      • 2018-09-10
      • 1970-01-01
      • 2016-06-25
      • 2019-11-24
      相关资源
      最近更新 更多