1

問題がありますが、これをどのように回避すればよいかわかりません。

私はループバックを使用していますが、遅かれ早かれmongodbで同じ問題に直面していたと思います。私が何をしているのか説明しましょう:

  • 別の REST サービスからエントリを取得し、API 応答用のエントリを準備します (データベースからの ID がないため、エントリはまだ準備ができていません)
  • 応答を送信する前に、エントリがデータベースに存在するかどうかを確認します。存在しない場合:
    • 存在する場合は作成します (source_id で決定):
    • それを使用して、新しいバージョンに更新してください
  • エントリを含む応答を送信します (エントリにはデータベース ID が割り当てられています)

これは問題ないようで、実装も簡単ですが、私の知る限りではありません。コードでさらに説明しようとします:

//This will not work since there are many async call, and fixedResults will be empty at the end
var fixedResults = [];
//results is array of entries
results.forEach(function(item) {
    Entry.findOne({where: {source_id: item.source_id}}, functioN(err, res) {
        //Did we find it in database?
        if(res === null) { 
            //Create object, another async call here
            fixedResults.push(newObj);
        } else {
            //Update object, another async call here
            fixedResults.push(updatedObj);
        }
    });
});
callback(null, fixedResults);

注: コードの一部を省略しましたが、読んでいただければ一目瞭然だと思います。

したがって、すべてのオブジェクトを反復処理し、データベースでそれらを作成または更新し、すべてが更新/作成されたらそれらを使用します。どうすればいいですか?

4

4 に答える 4

1

Promise を使用できます。これらは、他の条件が完了した後に呼び出されるコールバックです。プロミスを連鎖させる例を次に示します https://coderwall.com/p/ijy61g

ライブラリはq良いものです - https://github.com/kriskowal/q

This question how to use q.js promises to work with multiple asynchronous operationsは、これらを構築する方法の良いコード例を提供します。

于 2014-07-16T19:12:58.123 に答える
0

Mongo には upsert という機能があります。

http://docs.mongodb.org/manual/reference/method/db.collection.update/

チェックを必要とせずに、まさにあなたが求めていることを行います。3 つのすべてのリクエストを asnc として起動し、結果が true として返されることを検証するだけです。追加の処理は必要ありません。

于 2014-07-16T19:23:04.387 に答える