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