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