Ponieważ wszystkie asynchroniczne operacje sterownika MongoDB zwracają już obietnicę, nie należy używać new Promise
w ogóle, ale stwórz łańcuch obietnic:
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;
});
}
Rozumiem, że chcesz przekazać database
jako argument dla następnego then
, ale napotkasz problem polegający na tym, że nie będzie on dostępny w catch
treser. Jednym z rozwiązań jest użycie zmiennej o zakresie funkcji, która zostaje przypisana po otwarciu połączenia, tak jak robi to powyższy kod.
Jeśli ci się to nie podoba, możesz utworzyć nowy łańcuch obietnic wewnątrz .then
handler dla 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;
});
});
}