2017-01-09 105 views
0

我試圖以異步方式執行多個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錯誤。有沒有辦法做到這一點,或者我必須同步運行它們嗎?每次回調function(err, data)

回答

2

呼叫第二和第三功能:

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,否則它會繼續處理你的請求,即使它在你的錯誤條件下。

+0

但是這會使它們同步。沒有辦法使它們異步嗎? – SalmaFG

+0

@SalmaFG這是100%異步的。我認爲你是混合概念(順序!=同步) – zurfyx

+0

@SalmaFG看到我的編輯,添加有用的信息,可能會幫助你解決問題 – zurfyx