使用mongoose和async时,快速响应不起作用

时间:2014-01-06 14:43:17

标签: node.js express mongoose

我正在使用快递和猫鼬。当我使用mocha测试运行此端点时,我有一个奇怪的问题。

exports.broadcastMessages = function(req, res, next) {
  User.find({}, function(err, users) {
    if(err) return next(err);

    var push = function(user, callback) {
      user.messages.push(req.body.message);
      user.save(function(err) {
        callback(err);
      });
    };

    var fin = function(err) {
      if (err) {
        return next(err);
      }
      console.log('aaaaaaaaaa');
      return res.send('ok');
    };

    async.each(users, push, fin);
  });
};

然后我收到超时错误。只有一个用户。所以这不是时间问题。我确信res.send('ok')被调用了。但是当我删除user.save()时。它起作用了......

exports.broadcastMessages = function(req, res, next) {
  User.find({}, function(err, users) {
    if(err) return next(err);

    var push = function(user, callback) {
      user.messages.push(req.body.message);
      callback(err);
    };

    var fin = function(err) {
      if (err) {
        return next(err);
      }
      console.log('aaaaaaaaaa');
      return res.send('ok');
    };

    async.each(users, push, fin);
  });
};

我不知道为什么。为什么再添加一个user.save()它不起作用?调用res.send但没有响应。

快递的版本是3.4.7。猫鼬是3.8.2。

1 个答案:

答案 0 :(得分:0)

当你说“我收到超时错误”时,你的意思是摩卡失败了吗?如果是这样,那么你的mocha测试本身可能无法正确调用done()。上面的代码看起来不错,我认为它应该可行。一些错误点:

每当你有这种模式时:

user.save(function(err) {
  callback(err);
});

您不需要额外的包装函数,除了调用回调之外什么都不做。只是做:

user.save(callback);

此外,循环访问用户并保存每个用户的效率远远低于让mongodb在一个命令中为您完成所有操作:

User.update({}, {$push: {messages: req.body.message}}, function (error) {...});