使用Mongoose承诺的最佳实践

时间:2016-06-26 20:39:07

标签: javascript node.js mongodb mongoose mongoose-schema

我对这个承诺概念很新。我不确定,但是看着这个,我相信我只是用诺言作为回调,而且我以承诺地狱结束了!

我有这个函数,假设从MongoUser数据库获取用户对象,更新它并再次保存。这是我的代码段:

var changePassword = function(data){
      return new Promise(function(fulfill, reject){
        MongoUser.findOne({username: data.username}).exec()
          .then(function(mongoUser){
            //mongoUser = new MongoUser();
            //mongoUser.username = data.username;
            mongoUser.password = data.password;
            mongoUser.save().then(function(){
              fulfill(data);
            }).catch(function(error){
              log.error("MongoDB Failed in updating data", {"error": error});
              reject(error);
            });
          })
          .catch(function(error){
            log.error("MongoDB Failed in updating data", {"error": error});
            reject(error);
          });
      });
};

任何想法如何使用Mongoose返回的承诺而不创建新的承诺?

2 个答案:

答案 0 :(得分:4)

已经有Mongoose supports promises,所以我认为您可以将代码重写为:

var changePassword = function(data) {
  return MongoUser.findOne({username: data.username}).then(function(mongoUser) {
    mongoUser = new MongoUser();
    mongoUser.username = data.username;
    mongoUser.password = data.password;
    return mongoUser.save();
  }).catch(function(error){
    log.error("MongoDB Failed in updating data", {"error": error});
    throw error;
  });
};

(虽然我不确定你为什么要创建一个可能已存在的用户)。

答案 1 :(得分:1)

正确地说:猫鼬已经支持promises了。另外,我认为您不需要创建具有新凭据的新用户,而是需要更改当前用户的密码。此外,我在调用“changePassword”函数时返回了数据。

var changePassword = function(data){
  return MongoUser.findOne({username: data.username}).exec()
      .then(function(mongoUser){
        mongoUser.username = data.username;
        mongoUser.password = data.password;
         return mongoUser.save();
      })
     .then(function(newSavedData) {
                return newSavedData; // returns the new saved data
      })
     .catch(function(error){
          log.error("MongoDB Failed in updating data", {"error": error});
          reject(error);
      });
};
相关问题