sql >> データベース >  >> NoSQL >> MongoDB

NodePromiseでの非同期Mongoアクションの正しい処理

    MongoDBドライバーのすべての非同期操作はすでにpromiseを返すため、new Promiseを使用しないでください。 まったくですが、プロミスチェーンを設定します:

    function updateDatabase(name, token) {
      let database;
      return MongoClient.connect(MONGODB_URL).then(db => {
        database = db;
        return database
          .collection("testCollection")
          .update({ name }, { $pull: { tokens: { $in: [token] } } });
      })
      .then(() => {
        return database.collection("log").insert({
          name,
          token
        });
      })
      .then(() => {
        database.close(true);
      })
      .catch(err => {
        database.close(true);
        throw err;
      });
    }
    

    databaseを渡したいとのことですが 次のthenの引数として 、ただし、catchでは利用できないという問題が発生します ハンドラ。 1つの解決策は、上記のコードのように、接続を開いた後に割り当てられる関数スコープの変数を使用することです。

    それが気に入らない場合は、.then内に新しいpromiseチェーンを作成できます。 MongoClient.connectのハンドラー :

    function updateDatabase(name, token) {
      return MongoClient.connect(MONGODB_URL).then(database => {
        return database
          .collection("testCollection")
          .update({ name }, { $pull: { tokens: { $in: [token] } } })
          .then(() => {
            return database.collection("log").insert({
              name,
              token
            });
          })
          .then(() => {
            database.close(true);
          })
          .catch(err => {
            database.close(true);
            throw err;
          });
      });
    }
    


    1. 人間が読める形式の日付形式でBSONをJSONに変換する方法

    2. マングースの自動再接続オプション

    3. phpでmongodbクエリを文字列として渡すことはできますか

    4. MongoDB-アグリゲーションパイプラインによるコメントの賛成/反対