async / await doesn't seem to work nodejs passport reset passwd

Bur*_*ive 2 node.js express passport.js

For some reason i get this Error :

错误:req#login 需要在 Exports.update (/home/project) 处的 IncomingMessage.req.login.req.logIn (/home/project/node_modules/passport/lib/http/request.js:47:44) 处使用回调函数/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('/');
};
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么 ?我想不通..

Eki*_*Koc 5

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

req.login(updatedUser, function(err, data) {
  // handle err and data
});
Run Code Online (Sandbox Code Playgroud)

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

您可以围绕此调用建立一个承诺,如下所示:

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

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