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

Korrekt håndtering af asynkrone Mongo-handlinger i Node Promise

Da alle asynkrone operationer af MongoDB-driveren allerede returnerer et løfte, bør du ikke bruge new Promise overhovedet, men opret en løftekæde:

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

Jeg forstår, at du vil videregive database som et argument for den næste then , men du vil støde på det problem, at det ikke vil være tilgængeligt i catch handler. En løsning er at bruge en variabel med funktionsomfang, der bliver tildelt efter åbning af forbindelsen, ligesom koden ovenfor gør.

Hvis du ikke kan lide det, kan du oprette en ny løftekæde inde i .then handler for 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. Forskellen mellem cursor.count() og cursor.size() i MongoDB

  2. bruger streng til mongodb _id

  3. Sådan konverteres en bestemt dtype-objektkolonnes felt til kolonne med dataramme i pandaer

  4. gruppe MongoDB-indsamling efter måned og aggregeret omsætning for churn/indtægtsdiagram