CNode

談談mongoose的promise化

Llostemper发布于12 年前最后回复10 年前22 回复31403 浏览0 收藏

請問mongoose的API如何promise化 是否需要的話一個個自行用Q來封裝呢? 這樣一來 如果需要比較多的API 難免代碼重複和機械。

查看回复

回复 (22)

Y
yongningfu#1·10 年前

好贴 mark

R
ravenwang#2·12 年前

mongoose本身就支持promise:

    var promise = Model.find().exec();
    promise.then(
      function(result) {
        // on resolve
      },
      function(err) {
        // on reject
      }
    );
S
simongfxu#4·12 年前

@ravenwang @alsotang 确实需要,昨天写了一个基于blubird的,名字叫mongoomise

还有一个韩国人写的mongoose-q,这个是基于Q。

不过Q的性能不行,API接口也很龊,没有bluebird好用。

T
Treri#5·12 年前

我在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这种库的

S
simongfxu#7·12 年前

@Jeremial documet上的实例方法比如save、update、remove等是不能简单promisify的 如果添加了pre和post,promisify是会出问题的。 save方法是肯定不行,因为mongoose内部默认用hooks加了三个pre,比如validation等

T
Treri#9·12 年前
引用 Treri我在koa里面使用的是原生的mongoose. 看mongoose的文档可以知道, Query exec会返回promise. 只要返回类型是query的话,就可以执行exec方法, 这样就会...

@MJerry 是反问 还是疑问? 1楼就是用的普通的promise的方法嘛, co是支持yield一个promise的, 所以在koa里面就可以直接yield一个promise, 结果就是promise的结果

M
mjerry#12·12 年前
T
Treri#13·12 年前
引用 Treri我在koa里面使用的是原生的mongoose. 看mongoose的文档可以知道, Query exec会返回promise. 只要返回类型是query的话,就可以执行exec方法, 这样就会...

@MJerry 按照我自己的习惯, 我觉得yield一个promise就够用了. 使用其它的方法, 还是离不开 async或者promise等方法, 我感觉本质上差不多.

J
j60017268#14·11 年前

不知道这样行不行:

Model.find().exec().then(function(results) {
        // on resolve
      }).then(function(){
	  // on resolve
	  }).then(undefined,function(err) {
        // deal err
      });
B
bluenaux#15·11 年前

Mongoose 的Promise 与ES6 Promise不一样 可以:

mongoose.Promise = Promise
J
j60017268#16·11 年前

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/

H
Hi-Rube#17·11 年前
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;
    }
};

这样是不是狠繁琐

G
giscafer#18·10 年前

看官方给出的解决方案: http://mongoosejs.com/docs/promises.html

Z
zeroone001#19·10 年前

原来返回的是promises对象

X
xjtroddy#20·10 年前

user.save方法该怎么promise化啊?直接用promisify好像不行啊

C
Christine95#21·10 年前

var journals = yield journalModel.find().exec(); this.body = yield render('list', {journals:journals});

利用.exec() promise化,再利用yield得到结果即可。

S
SoaringTiger#22·10 年前
引用 xjtroddyuser.save方法该怎么promise化啊?直接用promisify好像不行啊

@xjtroddy ' someModel.create(req.body) .then(newData=>{ //处理新插入的数据

                    })
                    .catch(err=>{
                        //处理错误
                    });

' http://erikaybar.name/using-es6-promises-with-mongoosejs-queries/

参与回复
登录后即可参与回复。登录