【问题标题】:Best Practice of using Promise with Mongoose将 Promise 与 Mongoose 一起使用的最佳实践
【发布时间】:2016-06-26 20:39:07
【问题描述】:

我对这个承诺概念很陌生。我不确定,但看看这个,我相信我只是将 promise 用作回调,而我将在 promise 地狱中结束!

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

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 返回的承诺吗?

【问题讨论】:

  • 您返回的数据与作为参数传递的数据相同吗?是故意的吗?
  • 认为fulfull(data)return data 相同,而reject(error) 只是throw error,因此之后您可以摆脱包装承诺。
  • 不需要添加额外的 Promise ,Mongoos 也返回一个 Promise

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


【解决方案1】:

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;
  });
};

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

【讨论】:

  • 哦,我的错!我应该使用更新方法而不是这么麻烦。感谢您注意到这一点。
【解决方案2】:

说得对:Mongoose 已经支持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);
      });
};

【讨论】:

  • 是的,我的错,那是一个错误。谢谢:)
猜你喜欢
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 2015-11-12
  • 1970-01-01
  • 2022-06-22
  • 2018-08-13
  • 1970-01-01
相关资源
最近更新 更多