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