2017-01-09 5 views
0

私は非同期的に複数のModel.count()質問を実行しようとしています。しかし、これらのクエリのいずれかがエラーを返す場合は、停止して戻りたいと思っています。これは私のコードです:質問が非同期に

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

コール2番目と3番目の機能:あなたはまた、そのためにmongoose promisesを使用することができます

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. 
}); 

は、その後、すぐ隣でそれらをチェーン。

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

編集:

Error: Can't set headers after they are sent 

あなたのパラレルリクエスト(可能if(error ||から3)から、ユーザへの応答4まで送信しているため、このエラーを取得しています。

また、resごとにreturnにする必要があります。そうしないと、条件が満たされていなくてもリクエストが処理され続けます。

+0

しかし、これはそれらを同期させます。非同期にする方法はありませんか? – SalmaFG

+0

@SalmaFGこれは100%非同期です。私はコンセプトを混合していると思います(シーケンシャル!=同期) – zurfyx

+0

@SalmaFGあなたの問題解決に役立つ有益な情報を追加しました – zurfyx