2016-07-03 10 views
0

forEachループでfree/sandbox mongolab dbインスタンスに複数の呼び出しを実行しようとしていて、同じ応答を返すと応答が返されます)第二の送信は動作します:ここにmongolabへの複数の非同期呼び出しの実行が失敗しました

は私のforEachです:

router.get('/api/dashboard', function(req, res){ 
    var users = cacheAgent.get('users'); 
    var stats = { balance: [] }; 
    users.asArray.forEach(function(user){ 
    getUserBalance(user.id, function(userBalance){ 
     stats.balance.push({ id: user.id, name: user.name, balance: userBalance.balance }); 
     if (stats.balance.length == users.asArray.length){ 
      res.json({users: users, stats:stats}); 
     } 
    }); 
    }); 
}); 

そして、実際の機能:

var getUserBalance = function(userId, callbackFn){ 
    console.log('getting balance for user: ' + userId); 
    Record.aggregate([ 
    { $unwind: '$action'}, 
... 
    ], function(err, result){ 
     //console.log({ balance: result[0], error: err }); 
     callbackFn({ balance: result[0].userTotal }); 
    }); 
} 

私はリクエストに応じて、単一のgetUserBalanceを実行し、私は例えば、何の問題を取得していない他の後にそのURL 1を呼び出す場合:、その該当する場合

router.get("/api/getbalance/:id",function(req,res){ 
    var userId = req.params.id; 
    getUserBalance(req.params.id, function(result){res.json(result)}); 
}); 

わからないが、クエリはMongoの集計関数であり、それも作品の前に働いていた単一の呼び出しをしませ押しつぶすた後、私はあなたがおそらくあなたの集計クエリでの動作中に$を実行することによって、これを達成することができます任意の助け

答えて

1

を事前に再起動アプリケーションへ

感謝を持っており、後で集約パイプラインで$ groupを使用してグループ化しますuserIdによってこの方法でデータベースを複数回(各ユーザーごとに1回)実行する必要はなく、foreachループから少し外れるようなロジックに頼るのを避けることができます。ここでは、要件に合わせて変更する必要がある例を示します。

編集:あなたのコールバックにres.jsonを追加するだけです。いずれか、またはあなたのコールバック関数を完全に取り除くことができます:

var getUsersBalance = function(userIds) {  
Record.aggregate([ 
    { userId: { $in: userIds } } // userIds is an array 
    { $unwind: '$action'}, 
    ... 
    { $group: { /* group by userId */ } } 
], function(err, result){ 
    res.json(results); 
}); 
} 
+0

ありがとうスチュアート、それは良い考えです、私は流れを変更します。 私はまだこの問題を引き起こしたのでしょうか?そのような問題は解決できないはるかに複雑なケースで後で発生するかもしれません:) しかし、この問題は解決します。 – OfirYaron

+1

問題ありません!私はあなたが問題を抱えている理由は、JavaScriptがシングルスレッドであるためだと思います。続行する前に完了したforループの各繰り返しを伝える必要があります。詳細な説明については、この回答をご覧ください: http://stackoverflow.com/questions/26176957/looping-array-and-checking-mongodb-collection-in-loop-async –

関連する問題