MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Gestione corretta delle azioni Mongo asincrone in Node Promise

Poiché tutte le operazioni asincrone del driver MongoDB restituiscono già una promessa, non dovresti usare new Promise affatto, ma imposta una catena di promesse:

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

Ho appreso che vuoi passare il database come argomento per il prossimo then , ma ti imbatterai nel problema che non sarà disponibile in catch gestore. Una soluzione consiste nell'utilizzare una variabile con ambito funzione che viene assegnata dopo l'apertura della connessione, come fa il codice sopra.

Se non ti piace, puoi creare una nuova catena di promesse all'interno di .then gestore per 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;
      });
  });
}