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