請問mongoose的API如何promise化 是否需要的話一個個自行用Q來封裝呢? 這樣一來 如果需要比較多的API 難免代碼重複和機械。
mongoose本身就支持promise:
var promise = Model.find().exec();
promise.then(
function(result) {
// on resolve
},
function(err) {
// on reject
}
);
@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这种库的
@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的结果