請問mongoose的API如何promise化 是否需要的話一個個自行用Q來封裝呢? 這樣一來 如果需要比較多的API 難免代碼重複和機械。
mongoose本身就支持promise:
var promise = Model.find().exec(); promise.then( function(result) { // on resolve }, function(err) { // on reject } );
Good!
@ravenwang @alsotang 确实需要,昨天写了一个基于blubird的,名字叫mongoomise
还有一个韩国人写的mongoose-q,这个是基于Q。
不过Q的性能不行,API接口也很龊,没有bluebird好用。
我在koa里面使用的是原生的mongoose.
看mongoose的文档可以知道, Query#exec会返回promise. 只要返回类型是query的话,就可以执行exec方法, 这样就会返回一个promise. 这样就可以使用yield了 var user = yield User.findById(“xxxxxxxxxxxxxxxx”).exec()
如果是document, documet#save等方法, 就使用bluebird的promisify方法. yield Promise.promisify(user.save, user)()
所以基本上是不需要使用mongoose-q这种库的
1楼的方法不错? http://cnodejs.org/topic/53552311312420be08017e5a
@Jeremial documet上的实例方法比如save、update、remove等是不能简单promisify的 如果添加了pre和post,promisify是会出问题的。 save方法是肯定不行,因为mongoose内部默认用hooks加了三个pre,比如validation等
怎么不可以, 我已经在用了. http://kmanjs.com 这里面我添加了 pre, 但是同样也使用了promisify, 没有任何问题 https://github.com/jeremial/kman/blob/master/server/models/user.js#L15 https://github.com/jeremial/kman/blob/master/server/paths/sign.js#L123
@MJerry 是反问 还是疑问? 1楼就是用的普通的promise的方法嘛, co是支持yield一个promise的, 所以在koa里面就可以直接yield一个promise, 结果就是promise的结果
@Jeremial 没用过koa,yield这么神奇?我试下。
@damngoto 是的, koa使用了ES6的generator, 将callback hell问题基本解决掉了
@Jeremial 是请教,刚用koa。我的意思是说如果普通的promise就够用,就没必要用其他库?
@MJerry 按照我自己的习惯, 我觉得yield一个promise就够用了. 使用其它的方法, 还是离不开 async或者promise等方法, 我感觉本质上差不多.
不知道这样行不行:
Model.find().exec().then(function(results) { // on resolve }).then(function(){ // on resolve }).then(undefined,function(err) { // deal err });
Mongoose 的Promise 与ES6 Promise不一样 可以:
mongoose.Promise = Promise
mongoose默认的promise是mpromise。在mongoose 5.0中将被抛弃。如果native promise未实现,mongoose 5.0将采用bluebird。 针对4.1以上版本,我们可以手动修改mongoose中的promise: mongoose.Promise = require(‘bluebird’); 这样就可以使用catch等方法了。 参考文档:http://eddywashere.com/blog/switching-out-callbacks-with-promises-in-mongoose/
exports.findGroupDataByGroupKey = function *(groupKey) { const cb = yield new Promise((resolve) => { Admin.find( {'groups.groupKey': groupKey}, {'groups': {$elemMatch: {groupKey: groupKey}}}, function (err, group) { if (err) { resolve({ err, msg: true }); } else { resolve({ err, data: group[0].groups[0], msg: false }); } }); }); if (cb.msg) { console.log(cb.err); return false; } else { return cb.data; } };
这样是不是狠繁琐
看官方给出的解决方案: http://mongoosejs.com/docs/promises.html
原来返回的是promises对象
user.save方法该怎么promise化啊?直接用promisify好像不行啊
var journals = yield journalModel.find().exec(); this.body = yield render(‘list’, {journals:journals});
利用.exec() promise化,再利用yield得到结果即可。
@xjtroddy ’ someModel.create(req.body) .then(newData=>{ //处理新插入的数据
}) .catch(err=>{ //处理错误 });
' http://erikaybar.name/using-es6-promises-with-mongoosejs-queries/
好贴 mark
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
mongoose本身就支持promise:
Good!
@ravenwang @alsotang 确实需要,昨天写了一个基于blubird的,名字叫mongoomise
还有一个韩国人写的mongoose-q,这个是基于Q。
不过Q的性能不行,API接口也很龊,没有bluebird好用。
我在koa里面使用的是原生的mongoose.
看mongoose的文档可以知道, Query#exec会返回promise. 只要返回类型是query的话,就可以执行exec方法, 这样就会返回一个promise. 这样就可以使用yield了 var user = yield User.findById(“xxxxxxxxxxxxxxxx”).exec()
如果是document, documet#save等方法, 就使用bluebird的promisify方法. yield Promise.promisify(user.save, user)()
所以基本上是不需要使用mongoose-q这种库的
1楼的方法不错? http://cnodejs.org/topic/53552311312420be08017e5a
@Jeremial documet上的实例方法比如save、update、remove等是不能简单promisify的 如果添加了pre和post,promisify是会出问题的。 save方法是肯定不行,因为mongoose内部默认用hooks加了三个pre,比如validation等
怎么不可以, 我已经在用了. http://kmanjs.com 这里面我添加了 pre, 但是同样也使用了promisify, 没有任何问题 https://github.com/jeremial/kman/blob/master/server/models/user.js#L15 https://github.com/jeremial/kman/blob/master/server/paths/sign.js#L123
@MJerry 是反问 还是疑问? 1楼就是用的普通的promise的方法嘛, co是支持yield一个promise的, 所以在koa里面就可以直接yield一个promise, 结果就是promise的结果
@Jeremial 没用过koa,yield这么神奇?我试下。
@damngoto 是的, koa使用了ES6的generator, 将callback hell问题基本解决掉了
@Jeremial 是请教,刚用koa。我的意思是说如果普通的promise就够用,就没必要用其他库?
@MJerry 按照我自己的习惯, 我觉得yield一个promise就够用了. 使用其它的方法, 还是离不开 async或者promise等方法, 我感觉本质上差不多.
不知道这样行不行:
Mongoose 的Promise 与ES6 Promise不一样 可以:
mongoose默认的promise是mpromise。在mongoose 5.0中将被抛弃。如果native promise未实现,mongoose 5.0将采用bluebird。 针对4.1以上版本,我们可以手动修改mongoose中的promise: mongoose.Promise = require(‘bluebird’); 这样就可以使用catch等方法了。 参考文档:http://eddywashere.com/blog/switching-out-callbacks-with-promises-in-mongoose/
这样是不是狠繁琐
看官方给出的解决方案: http://mongoosejs.com/docs/promises.html
原来返回的是promises对象
user.save方法该怎么promise化啊?直接用promisify好像不行啊
var journals = yield journalModel.find().exec(); this.body = yield render(‘list’, {journals:journals});
利用.exec() promise化,再利用yield得到结果即可。
@xjtroddy ’ someModel.create(req.body) .then(newData=>{ //处理新插入的数据
' http://erikaybar.name/using-es6-promises-with-mongoosejs-queries/
好贴 mark