Aangezien alle asynchrone bewerkingen van het MongoDB-stuurprogramma al een belofte retourneren, moet u new Promise niet gebruiken helemaal niet, maar zet een belofteketen op:
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;
});
}
Ik begrijp dat je database wilt doorgeven als argument voor de volgende then , maar je zult het probleem tegenkomen dat het niet beschikbaar zal zijn in de catch afhandelaar. Een oplossing is om een functiebereikvariabele te gebruiken die wordt toegewezen na het openen van de verbinding, zoals de bovenstaande code doet.
Als je dat niet leuk vindt, kun je een nieuwe belofteketen maken binnen de .then handler voor 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;
});
});
}