代码之家  ›  专栏  ›  技术社区  ›  Classified

护照这个.set调用setPassword时不是函数

  •  2
  • Classified  · 技术社区  · 6 年前

    我无法使用passportJS setPassword。此代码在以前的项目(passport local mongoose:4.0.0,passport:0.3.2)中正常工作,但是现在在更新版本中我遇到了问题(passport local mongoose:5.0.1,passport:0.4.0)。

    const {promisify} = require('es6-promisify');
    
    exports.resetPassword = async (req, res) => {
      const user = await User.findOne({
        resetPasswordToken: req.params.token,
        resetPasswordExpires: { $gt: Date.now() }
      });
      
      if (!user) {
        req.flash('error', 'Password reset is invalid or has expired');
        return res.redirect('/login');
      }
    
      const setPassword = promisify(user.setPassword, user);
      await setPassword(req.body.password);
    
      user.resetPasswordToken = undefined;
      user.resetPasswordExpires = undefined;
      const updatedUser = await user.save();
      await req.login(updatedUser);
      req.flash('success', 'Your password has been reset!');
      res.redirect('/login');
    }

    TypeError: this.set is not a function
        at Promise.resolve.then.then.then.then.then.salt (...\node_modules\passport-local-mongoose\index.js:98:14)
    From previous event:
        at exports.updatePassword (...auth.controller.js:146:9)
        at 
        at process._tickCallback (internal/process/next_tick.js:188:7)
    0 回复  |  直到 6 年前
        1
  •  1
  •   user11401130 user11401130    5 年前

    万一别人也遇到同样的问题,

    从5.0.0版开始,passport local mongoose通过为除serializeUser和deserializeUser之外的所有实例和静态方法返回承诺来启用异步/等待。

    const user = new DefaultUser({username: 'user'});
    await user.setPassword('password');
    await user.save();
    const { user } = await DefaultUser.authenticate()('user', 'password');