好的,首先你在使用mongoose
right?
User
是你的猫鼬模型,它响应诸如findOne(query)
, findOneAndUpdate(query, update, opts)
etc..
调用其中任何一个方法后,调用该方法exec()
它返回一个查询。
查询并不完全是一个 Promise,您需要指定 Mongo 将使用哪些 Promise。在这里我建议使用原生的,因此,在您的项目中添加这一行:
const mongoose = require('mongoose')
mongoose.Promise = Promise
现在,这条指令返回给你一个 Promise,很好!
User.findOne(q).exec()
您现在可以使用您的逻辑创建 Promise 链,例如:
return User
.findOne(_id)
.exec()
.then((user) => {
return Receipt
.findOne({ bookName: user.bookName })
.exec()
})
.then((receipt) => {
// example
return res.status(200).json(receipt)
}))
})
提示:我建议创建辅助方法以使代码更加简洁:
/** @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)