Protože všechny asynchronní operace ovladače MongoDB již vracejí příslib, neměli byste používat new Promise
vůbec, ale nastavte řetězec slibů:
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;
});
}
Chápu, že chcete předat database
jako argument pro další then
, ale narazíte na problém, že nebude k dispozici v catch
psovod. Jedním z řešení je použití proměnné s rozsahem funkcí, která se přiřadí po otevření připojení, jako to dělá výše uvedený kód.
Pokud se vám to nelíbí, můžete vytvořit nový řetězec slibů uvnitř .then
handler pro 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;
});
});
}