Vì tất cả các hoạt động không đồng bộ của trình điều khiển MongoDB đã trả về một lời hứa, bạn không nên sử dụng new Promise
nhưng hãy thiết lập một chuỗi hứa hẹn:
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;
});
}
Tôi hiểu rằng bạn muốn chuyển database
làm đối số cho then
, nhưng bạn sẽ gặp phải sự cố rằng nó sẽ không khả dụng trong catch
người xử lý. Một giải pháp là sử dụng một biến phạm vi chức năng được gán sau khi mở kết nối, giống như đoạn mã ở trên.
Nếu bạn không thích điều đó, bạn có thể tạo một chuỗi hứa hẹn mới bên trong .then
trình xử lý cho 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;
});
});
}