【问题标题】:passport-local-mongoose changePassword function护照本地猫鼬更改密码功能
【发布时间】:2017-09-04 22:25:00
【问题描述】:

我想拥有用户可以更改密码的功能。 我已经实现了这样的路线('/resetPasswd'):

UserRouter.route('/resetPasswd')

.post(function (req, res, next) {
    passport.authenticate('local', function (err, user, info) {
        user.changePassword(req.body.oldPassword, req.body.newPassword, function (err, user) {
            if (err) next(err);
            res.json('password changes successfully !');
        })
    })(req, res, next);
});

这是我发送的正文:

{
    "oldpassword": "secret",
    "newPassword": "new"
}

但我收到此错误作为响应:

{
   "message": "user.changePassword is not a function",
   "error": {}
}

这是我的架构的图片:

用户架构:

我认为我不应该在我的架构中声明 changePassword 函数(因为它是由 passport-local-mongoose 提供的,虽然我添加了它但仍然得到同样的错误)我在这里犯了什么错误?

【问题讨论】:

  • 能否向我们展示您的架构和架构上的中间件(如果有)?
  • @turmuka : 我已经在帖子中提供了我的架构图片
  • @Syed Ayesha Bebe 我已经看过这篇文章,我不需要实现任何东西,因为所有功能都是由护照本身提供的。就是不知道怎么用
  • don't put code as images。复制代码并粘贴到这里

标签: node.js mongodb authentication passport-local


【解决方案1】:

实际上昨晚有人遇到了同样的问题。他们的问题是需要更新软件包。我会检查您是否使用最新版本。

【讨论】:

    【解决方案2】:

    这是我在控制器中处理重置密码时所做的,

    exports.editPassword = async (req, res) => {
      const user = await User.findOne({
        username: req.user.username
    });
    await user.setPassword(req.body.password);
    const updatedUser = await user.save();
    req.login(updatedUser);
    req.flash('success', 'Password Changed Successfully') res.redirect('back')
    }
    

    从文档Passport-local-mongoose,您首先需要获取特定用户来更新密码,在我的例子中是当前登录用户,它在我们的 req.user 上可用暴露于,您可以使用任何返回属性来查询您的集合,使用异步等待我创建了一个变量来保存返回对象,在我的情况下为“用户”,此后我将 setProperty 链接在它上面传递新密码(req .body.password),因为它返回一个承诺,我等待它并为其分配一个变量。从这里你很好......注意:因为它是一个承诺它要么解决拒绝,处理错误可以通过在安全毯子中敲击你的代码来完成,try..catch。你可以阅读更多Here

    【讨论】:

      【解决方案3】:

      由于changePassword是一种模式方法,它必须用于模型的实例,而不是模型本身或导入的passportLocalMongoose。

      UserModel.findById(req.user._id) 
      // I assume you already have authentication and the req.user is generated
              .then(foundUser => {
                  foundUser.changePassword(req.body.old, req.body.new)
                      .then(() => {
                          console.log('password changed');
                      })
                      .catch((error) => {
                          console.log(error);
                      })
              })
              .catch((error) => {
                  console.log(error);
              });
      

      在回调函数中发送的用户对象护照只是一个对象而不是模式实例文档对象,因此它没有changePassword函数。

      【讨论】:

      • 如果定义了 req.user 那么你可以直接使用 req.user.changePassword() 来修改密码。无需使用 UserModel.findById()。 Passport-local-mongoose 定义用户登录时的 req.user。
      猜你喜欢
      • 2021-03-25
      • 2019-12-05
      • 1970-01-01
      • 2016-06-21
      • 2021-05-20
      • 2018-01-20
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      相关资源
      最近更新 更多