MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Gestion correcte des actions Mongo asynchrones dans Node Promise

Étant donné que toutes les opérations asynchrones du pilote MongoDB renvoient déjà une promesse, vous ne devez pas utiliser new Promise pas du tout, mais mettez en place une chaîne de 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;
  });
}

Je comprends que vous souhaitez transmettre database comme argument pour le prochain then , mais vous rencontrerez le problème qu'il ne sera pas disponible dans le catch gestionnaire. Une solution consiste à utiliser une variable de portée fonction qui est affectée après l'ouverture de la connexion, comme le fait le code ci-dessus.

Si vous n'aimez pas cela, vous pouvez créer une nouvelle chaîne de promesses dans le .then gestionnaire pour 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;
      });
  });
}