Тъй като всички асинхронни операции на драйвера MongoDB вече връщат обещание, не трябва да използвате new Promise
изобщо, но настройте обещаваща верига:
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;
});
}
Разбирам, че искате да подадете database
като аргумент за следващия then
, но ще се натъкнете на проблема, че няма да е наличен в catch
манипулатор. Едно решение е да се използва променлива с функционален обхват, която се присвоява след отваряне на връзката, както прави кодът по-горе.
Ако това не ви харесва, можете да създадете нова обещаваща верига вътре в .then
манипулатор за 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;
});
});
}