Eftersom alla asynkrona operationer av MongoDB-drivrutinen redan ger ett löfte, bör du inte använda new Promise alls, men skapa en löfteskedja:
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;
});
}
Jag förstår att du vill skicka database som ett argument för nästa then , men du kommer att stöta på problemet att det inte kommer att vara tillgängligt i catch hanterare. En lösning är att använda en variabel med funktionsomfattning som tilldelas efter att anslutningen öppnats, som koden ovan gör.
Om du inte gillar det kan du skapa en ny löfteskedja i .then hanterare för 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;
});
});
}