在Mongoosepath中使用Promise
我理解JavaScript中的承诺或至less我认为我(如果我错了纠正我)。
创造一个承诺:
var promise = new Promise(function(resolve, reject){ // do something async here if(itWorked){ resolve(); }else { reject(); } });
使用承诺:
promise.then(function(result){ },function(err){ });
我有一个基于MEAN Stack的应用程序,我的一些mongoose路线正在成为一个回拨地狱。 我想摆脱mongoose路线的callback,并使用承诺来处理它们。 但我似乎无法弄清楚究竟是怎么做到的。
例如:
app.get('/users', function(req, res){ User.findOne(_id, function(err, user){ if(err) console.log(err) else if(user){ Receipt.findOne(user.bookName, function(err, book){ if(err) console.log(err) else if(book){ // again do something here } }) } }) });
在上面的例子中,你可以看到代码越来越难以阅读和维护。 我如何使用Promise来改善我的代码?
好的,首先你要用mongoose
吗?
User
是你的mongoose模型,对findOne(query)
, findOneAndUpdate(query, update, opts)
等方法做出响应。
在调用这些方法之后,调用返回Query的方法exec()
。
查询不完全是一个承诺,你需要指定Mongo将使用哪些承诺。 在这里,我会build议使用本地的,所以,在你的项目中添加这一行:
const mongoose = require('mongoose') mongoose.Promise = Promise
现在,这条指令正在给你答复,很好!
User.findOne(q).exec()
你现在可以用你的逻辑创build一个Promise链,例如:
return User .findOne(_id) .exec() .then((user) => { return Receipt .findOne({ bookName: user.bookName }) .exec() }) .then((receipt) => { // example return res.status(200).json(receipt) })) })
提示:我build议创build辅助方法,以使代码更加清洁:
/** @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)