Được rồi, trước tiên bạn có đang sử dụng mongoose
không bên phải?
User
là mô hình mongoose của bạn phản hồi với các phương thức như findOne(query)
, findOneAndUpdate(query, update, opts)
vv ..
Sau khi gọi bất kỳ phương thức nào trong số này, hãy gọi phương thức exec()
trả về một Truy vấn.
Một truy vấn không chính xác là một Lời hứa và bạn sẽ cần chỉ định Mongo sẽ sử dụng những Lời hứa nào. Ở đây tôi khuyên bạn nên sử dụng những cái gốc, hãy thêm dòng này vào dự án của bạn:
const mongoose = require('mongoose')
mongoose.Promise = Promise
Bây giờ, hướng dẫn này sẽ trả lại cho bạn một Lời hứa, thật tuyệt!
User.findOne(q).exec()
Bây giờ, bạn có thể tạo chuỗi Promise với logic của mình, ví dụ:
return User
.findOne(_id)
.exec()
.then((user) => {
return Receipt
.findOne({ bookName: user.bookName })
.exec()
})
.then((receipt) => {
// example
return res.status(200).json(receipt)
}))
})
Mẹo:Tôi khuyên bạn nên tạo các phương thức aux để làm cho mã sạch hơn nữa:
/** @return {Promise} */
function findUser(id) {
return User.findOne(id).exec()
}
/** @return {Promise} */
function findReceipt(bookName) {
return Receipt.findOne({ bookName }).exec()
}
// example
function f(req, res) {
const userId = req.get('id')
return findUser(userId)
.then((user) => findReceipt(user.bookName))
.then((receipt) => res.status(200).json(receipt))
.catch((err) => res.status(500).json(null))
}
// register your handler
app.get('/book', f)