Da alle asynchronen Operationen des MongoDB-Treibers bereits ein Promise zurückgeben, sollten Sie new Promise
nicht verwenden überhaupt, sondern richten Sie eine Versprechenskette ein:
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;
});
}
Ihren Angaben zufolge möchten Sie database
übergeben als Argument für das nächste then
, aber Sie werden auf das Problem stoßen, dass es nicht im catch
verfügbar ist Handler. Eine Lösung besteht darin, eine funktionsbezogene Variable zu verwenden, die nach dem Öffnen der Verbindung zugewiesen wird, wie es der obige Code tut.
Wenn Ihnen das nicht gefällt, können Sie innerhalb des .then
eine neue Promise-Kette erstellen Handler 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;
});
});
}