MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Korrekte Handhabung asynchroner Mongo-Aktionen in Node Promise

Da alle asynchronen Operationen des MongoDB-Treibers bereits ein Promise zurückgeben, sollten Sie new Promise nicht verwenden überhaupt, sondern richten Sie eine Versprechenskette ein:

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

Ihren Angaben zufolge möchten Sie database übergeben als Argument für das nächste then , aber Sie werden auf das Problem stoßen, dass es nicht im catch verfügbar ist Handler. Eine Lösung besteht darin, eine funktionsbezogene Variable zu verwenden, die nach dem Öffnen der Verbindung zugewiesen wird, wie es der obige Code tut.

Wenn Ihnen das nicht gefällt, können Sie innerhalb des .then eine neue Promise-Kette erstellen Handler für 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;
      });
  });
}