Mongoose查询异步

时间:2017-01-09 13:30:06

标签: node.js asynchronous mongoose

我正在尝试异步执行多个Model.count() mongoose查询。但是,我希望能够停止并返回以防任何这些查询返回错误。这是我的代码:

var User = require('../models/user').model;
module.exports = {
getStatistics: function(req, res) {
        var response = {};
        User.count({}, function(err, count) {
            if(err || !count) res.status(500).json({error: 'unknown error'});
            response.total_count = count;
        });
        User.count({platform: 'iOS'}, function(err, ios) {
            if(err || !ios) res.status(500).json({error: 'unknown error'});
            response.ios_count = ios;
        });
        User.count({platform: 'Android'}, function(err, android) {
            if(err || !android) res.status(500).json({error: 'unknown error'});
            response.android_count = android;
        });
        res.return(200).json(response);
    }
}

但是,我收到Error: Can't set headers after they are sent错误。有没有办法做到这一点,还是我必须同步运行它们?

1 个答案:

答案 0 :(得分:2)

在每个回调function(err, data)中调用第2和第3个函数:

User.count({}, function(err, count) {
  if(err || !count) res.status(500).json({error: 'unknown error'});
  response.total_count = count;

  // Call your 2nd function.
  User.count(..} // and so on.
});

你也可以使用mongoose promises,然后用下一个链接它们。

User.count({}).exec()
  .then((data) => {
    // 2nd function.
    return User.count({...});
  })
  .then((...) => {...} // and so on.

修改

Error: Can't set headers after they are sent

您收到此错误的原因是您向用户发送了最多4个回复,来自您的并行请求(3个来自可能的if(error ||)。

您还应该确保returnres {}},否则它会继续处理您的请求,即使它属于您的错误条件。