【问题标题】:Express response doesn't work when using mongoose and async使用猫鼬和异步时快速响应不起作用
【发布时间】:2014-01-06 23:30:05
【问题描述】:

我正在使用 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 被调用但没有响应。

express的版本是3.4.7。 Mongoose 是 3.8.2。

【问题讨论】:

    标签: node.js express mongoose


    【解决方案1】:

    当您说“我收到超时错误”时,您的意思是 mocha 因测试时间过长而未能通过测试吗?如果是这样,那可能是您的 mocha 测试本身没有正确调用 done() 的问题。上面的代码对我来说看起来不错,我认为它应该可以工作。一些杂项:

    只要你有这种模式:

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

    你不需要那个除了调用回调什么都不做的额外包装函数。做吧:

    user.save(callback);
    

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

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

    【讨论】:

    • 哦是的哈哈我忘记在摩卡测试中打电话给done()。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2018-01-12
    • 2015-10-23
    • 2018-07-25
    • 2023-03-03
    • 1970-01-01
    • 2022-08-13
    • 2021-02-03
    • 2019-02-15
    相关资源
    最近更新 更多