0

MongoDB クエリを作成し、結果のそれぞれに追加のフィールドを追加する必要があります。フィールド値は、別のクエリの結果に依存します。

コードでネストされたクエリを呼び出そうとしていserver.jsます。res.json(data)データ要素が変更される前に呼び出されるため、機能していません。forEachコードでネストされたクエリを使用する (またはorのようなものを使用するaggregate)ことを行う方法があると思いますdb.jsが、JavaScript/Mongo の経験が不足しているため、適切な解決策を見つけることができませんでした。

どんな助けでも大歓迎です。

サーバー.js

app.get("/get_users_list", function(req, res) {
    db.getUsersByCity(req.query.city, function(err, data) {
        if (err) {
            res.send(err);
        } else {
            for(var i in data) {
                var rec = data[i];
                db.checkVisitation({'user_id': req.query.user_id, 'friend_id': rec.user_id},
                    function(inner_err, inner_data) {
                        if (inner_data) {
                            rec["visited"] = "true";
                        } else {
                            rec["visited"] = "false";
                        }            
                });
            }
            res.json(data);
        }
    });
});

db.js

 var checkVisitation = function(visitJSON, callback) {
    db.visitations.findOne(visitJSON, callback);
 }

var getUsersByCity = function(city, callback) {
    db.users.find({'city': city}).toArray(callback);
}

編集:

内部コールバック内にチェックを追加することで、問題を解決できました。

if (i == data.length - 1) {
    res.json(data);
} 
4

2 に答える 2

2

db からすべての応答を取得した後でのみ、res.json を呼び出す必要があります。リクエストは非同期であるため、リクエストが完了するまで待機するようにコードを整理する必要があります。非同期呼び出しを使用してコードを編成するには、広く採用されている 2 つの方法があります。

  1. async.js を使用するhttps://github.com/caolan/async
  2. promise を使用するhttps://github.com/kriskowal/q

現在のコードに近いため、非同期から始めることをお勧めします

于 2014-05-16T15:20:39.393 に答える
0

for ループ内に res.json(data) があるため、ループが終了したときではなく、for ループの最初のインクリメントでデータを送信します。

res.json(data); を実行する前に、for ループが終了していることを確認するコールバックまたはチェックが必要です。

また、rec は返さない別の変数であるため、rec を設定するのではなく、おそらく data[i]["visited"] = "true" または false を設定する必要があります。

于 2014-05-16T14:35:48.613 に答える