【问题标题】:Updating each element in MongoDB database in for loop在 for 循环中更新 MongoDB 数据库中的每个元素
【发布时间】:2014-08-03 03:25:15
【问题描述】:

我有一个用户 ID 数组 (MongoDB Objectids),我想遍历每个用户 ID,在我的 MongoDB 用户数据库中找到它的用户条目,然后更新它,比如修改用户的年龄。然后只有当每个用户都更新了,我才想说res.send(200); 在我的Node.js Express 应用程序中。

我从以下代码开始,由于对findById 的异步调用,这是完全错误的:

for (var i = 0; i < userIDs.length; i++) {
    var userID = userIDs[i];

    User.findById(userID, function (err, user) {
        if (err) throw err;

        // Update user object here

        user.save(function (err, user) {
            if (err) throw err;
            res.send(200);
        });
    });
}

有什么想法可以做到这一点吗?是否有findById 的同步版本?或者也许是一种通过数组map 并将函数应用于每个元素的方法?

谢谢!

【问题讨论】:

  • “由于异步而完全错误”,你是真的吗?故意异步不阻塞
  • @IlanFrumer 我的意思是当我有多个要更新的对象时,我在异步块中做res.send(200) 是完全错误的。当然我知道不阻塞是故意异步的。

标签: node.js mongodb


【解决方案1】:

我想你想要 npm 的 async 模块的 forEach 方法。它看起来像这样:

async.forEach(userIDs, function(id, callback) {
    User.findById(id, function(err, user){
        if(err) throw err;
        user.save(function(err, user){
            if(err) throw err;
            callback();
        }
    }, function(err){
        if(err){
            throw err;
        } else {
            res.send(200);
        }
    }
}

【讨论】:

  • 不要在迭代器函数中throw。您应该将错误传递给回调callback(err)(如果您想停止迭代)或忽略它(如果您想忽略它)。实际上,您真的不应该在任何异步代码中使用throw
  • 非常感谢您介绍async 库!它有一些惊人的功能!这有效!
  • 请注意,Aaron Dufour。实际上,我一直在尝试确定最终处理此类错误的最佳位置。
【解决方案2】:

最好的方法是使用 Promise。

Q#all 示例:

var q = require('Q');

var promises = userIDs.map(function(userID){

  var deferred = q.defer();

  User.findById(userID, function (err, user) {
     if (err) return deferred.reject(err);

    // Update user object here

    user.save(function (err, user) {
      if (err) return deferred.reject(err);      
      deferred.resolve(user);
    });
  });

  return deferred.promise;

});


q.all(promises)
  .then(function(users){
    res.json(users);
  })
  .fail(function(err){
    res.send(500,err);
  });

【讨论】:

    猜你喜欢
    • 2021-08-24
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    相关资源
    最近更新 更多