sql >> Base de Datos >  >> NoSQL >> MongoDB

Manejo correcto de acciones asíncronas de Mongo en Node Promise

Dado que todas las operaciones asincrónicas del controlador MongoDB ya devuelven una promesa, no debe usar new Promise en absoluto, pero configura una cadena de promesas:

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

Entiendo que quieres pasar database como argumento para el siguiente then , pero se encontrará con el problema de que no estará disponible en catch manipulador. Una solución es usar una variable con ámbito de función que se asigna después de abrir la conexión, como lo hace el código anterior.

Si no te gusta eso, puedes crear una nueva cadena de promesas dentro de .then controlador para 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;
      });
  });
}