【问题标题】:Mongoose promises and bluebird猫鼬承诺和蓝鸟
【发布时间】:2015-10-27 05:48:57
【问题描述】:

node 会不会有 Promise 的内置实现,还是应该采用主要库之一?比如 Q/Blueblird?我有一个使用 async.waterfall 的代码,我想将其移动以使用 Promise。链接函数之一是 mongoose findOne,它从 mongoose 4.0 开始返回一个承诺,但我知道混合承诺类型是不好的做法,因为 mongoose 使用它自己的承诺实现,我想使用 Q/Bluebird。我应该在猫鼬上使用 promsifyAll 吗? or will promisify 一旦在节点中实现承诺,将被弃用 目前的代码是:

async.waterfall([
    function(done){
        User.findOne({ email: reco.mail }, done);
    },
    function(receiverUser, done){
        if (!receiverUser){

        } else {
        }

        // send the model to mongoose to get verified and persisted
        reco.save(function (err) {
            if (err) {
                //handle error
            }

            return done(err);
        });
    }
], function(err){
    if (err) {
        console.error('unexpected error while creating reco', err);
        return res.status(500).send({});
    }

    console.log('reco created successfully', reco);
    return res.status(201).send({});
});

我想改成 ().then.catch() 样式

【问题讨论】:

    标签: javascript node.js mongodb promise


    【解决方案1】:

    我建议你保持以下方式,至少我正在使用这种方法并且它有效。请检查下面的代码示例。

    var Promise = require('bluebird');
    //declaration
    userSchema.statics.search = function (query) {
      return new Promise(function(resolve, reject){
        return mongoose.model('User')
          .find(query)
          .exec()
          .then(function(foundUsers){
            resolve(foundUsers);
          })
          .onReject(function(err){
            reject(err);
          });
      });
    };
    
    //using
    var UserModel = require('path/to/user/model');
    UserModel
      .search(<query>)
      .then(function(foundUsers){
        //do something
      })
      .catch(function(err){
        //so something
      });
    
    
    //declaration
    userSchema.methods.saveMe = function () {
      var user = this;
      return new Promise(function (resolve, reject) {
        user.save(function (err) {
          if (err) {
            reject(err);
          } else {
            resolve(user);
          }
        });
      });
    };
    
    
    //using
    var UserModel = require('path/to/user/model');
    var newUser  = new UserModel(newUserData);
    newUser
      .save(function(savedUser){
        //do something
      })
      .catch(function(err){
        //so something
      });
    

    当然,在这种情况下使用“Promisify”也有帮助,但有几次我遇到了问题,所以我决定将 Mongoose Promise 转换为众所周知的格式。

    【讨论】:

      猜你喜欢
      • 2015-11-19
      • 2016-11-21
      • 2016-09-23
      • 2016-06-04
      • 1970-01-01
      • 2016-06-10
      • 2015-03-05
      • 2015-03-06
      • 2016-05-25
      相关资源
      最近更新 更多