MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Manipulação correta de ações assíncronas do Mongo no Node Promise


Como todas as operações assíncronas do driver MongoDB já retornam uma promessa, você não deve usar new Promise nada, mas configure uma cadeia de promessas:
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;
  });
}

Entendo que você deseja passar database como argumento para o próximo then , mas você encontrará o problema de que ele não estará disponível no catch manipulador. Uma solução é usar uma variável com escopo de função que é atribuída após a abertura da conexão, como o código acima.

Se você não gostar disso, você pode criar uma nova cadeia de promessas dentro do .then manipulador 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;
      });
  });
}