【问题标题】:async / await doesn't seem to work nodejs passport reset passwdasync / await 似乎不起作用 nodejs passport reset passwd
【发布时间】:2019-04-20 17:12:24
【问题描述】:

由于某种原因,我收到此错误:

错误:req#login 需要回调函数 在 IncomingMessage.req.login.req.logIn (/home/project/node_modules/passport/lib/http/request.js:47:44) 在exports.update (/home/project/controllers/authController.js:92:13) 在 process.internalTickCallback (internal/process/next_tick.js:77:7)

使用此代码:

exports.update = 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! You are now 
logged in!');
  res.redirect('/');
};

我做错了什么?我想不通。。

【问题讨论】:

    标签: node.js express passport.js


    【解决方案1】:

    正如Ekin Konc 回答的那样,您只能async/await 只有返回Promise 的函数。

    您可以编写一些中间件来将您的 req.login 别名为 promisified 函数。

    例如

    loginPromisifier.js

    const { promisify } = require('util');
    
    const loginPromisifier = (req,res,next)=>{
      req.login = promisify(req.login);
      next();
    }
    
    module.exports = loginPromisifier;
    

    然后app.js

    const loginPromisifier = require(./loginPromisifier) // your path to it
    app.use(loginPromisifier);
    

    希望对你有所帮助。

    【讨论】:

      【解决方案2】:

      根据错误消息,req.login(updatedUser); 期望回调作为第二个参数。基本上,你会做这样的事情:

      req.login(updatedUser, function(err, data) {
        // handle err and data
      });
      

      但是,由于您希望在此异步操作上 await,因此您需要返回承诺的东西。基本上,您可以等待任何作为承诺的值(login 不会返回一个。

      你可以像这样围绕这个调用构建一个承诺:

      await new Promise(function(res, rej) {
        req.login(updatedUser, function(err, data) {
          if (err) rej(err);
          else res(data);
        });
      })
      

      Node.JS 附带一个名为 promisify 的辅助函数,如果您不希望每次都手动执行此操作,则可以帮助构建此行为。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-18
        • 2017-12-12
        • 1970-01-01
        • 1970-01-01
        • 2017-08-27
        • 2019-01-03
        • 1970-01-01
        相关资源
        最近更新 更多