sql >> Databasteknik >  >> NoSQL >> MongoDB

Korrekt hantering av asynkrona Mongo-åtgärder i Node Promise

Eftersom alla asynkrona operationer av MongoDB-drivrutinen redan ger ett löfte, bör du inte använda new Promise alls, men skapa en löfteskedja:

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

Jag förstår att du vill skicka database som ett argument för nästa then , men du kommer att stöta på problemet att det inte kommer att vara tillgängligt i catch hanterare. En lösning är att använda en variabel med funktionsomfattning som tilldelas efter att anslutningen öppnats, som koden ovan gör.

Om du inte gillar det kan du skapa en ny löfteskedja i .then hanterare 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;
      });
  });
}


  1. kryptiskt mongodb-fel LEFT_SUBFIELD stöder endast Objekt:statistik inte:6

  2. Automatisera databashälsokontroll

  3. Hur projekterar DBRef på Spring MongoDB Aggregation?

  4. Ställer in dynamisk sökväg i redis.conf med hjälp av variabeln Environment