Da alle asynkrone operationer af MongoDB-driveren allerede returnerer et løfte, bør du ikke bruge new Promise
overhovedet, men opret en løftekæde:
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;
});
}
Jeg forstår, at du vil videregive database
som et argument for den næste then
, men du vil støde på det problem, at det ikke vil være tilgængeligt i catch
handler. En løsning er at bruge en variabel med funktionsomfang, der bliver tildelt efter åbning af forbindelsen, ligesom koden ovenfor gør.
Hvis du ikke kan lide det, kan du oprette en ny løftekæde inde i .then
handler for 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;
});
});
}