异步/等待似乎不起作用node.js护照重置密码

时间:2018-11-17 22:19:35

标签: node.js express passport.js

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

错误: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('/');
};

我在做什么错?我不知道..

2 个答案:

答案 0 :(得分: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的帮助程序函数,以帮助您构造行为,如果您不希望每次都手动进行此操作。

答案 1 :(得分:0)

正好Ekin Konc回答时,您只能async/await的函数返回一个Promise

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

例如

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

我希望能有所帮助。