Node.js 异步/等待不';nodejs passport重置密码似乎不起作用

Node.js 异步/等待不';nodejs passport重置密码似乎不起作用,node.js,express,passport.js,Node.js,Express,Passport.js,出于某种原因,我出现了以下错误: 错误:req#登录需要回调函数 在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/nex

出于某种原因,我出现了以下错误:

错误:req#登录需要回调函数 在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('/');
};

我做错了什么?我想不出来

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

req.login(updatedUser, function(err, data) {
  // handle err and data
});
await new Promise(function(res, rej) {
  req.login(updatedUser, function(err, data) {
    if (err) rej(err);
    else res(data);
  });
})
但是,由于您希望在这个异步操作上等待,因此需要返回承诺的东西。基本上,您可以等待任何承诺值(并且
login
不会返回承诺值)

您可以围绕此通话建立如下承诺:

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

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

正如
Ekin Konc
所回答的那样,您只能
async/wait
只返回
承诺的函数

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

例如

loginPromisifier.js

const { promisify } = require('util');

const loginPromisifier = (req,res,next)=>{
  req.login = promisify(req.login);
  next();
}

module.exports = loginPromisifier;
const loginPromisifier = require(./loginPromisifier) // your path to it
app.use(loginPromisifier);
然后
app.js

const { promisify } = require('util');

const loginPromisifier = (req,res,next)=>{
  req.login = promisify(req.login);
  next();
}

module.exports = loginPromisifier;
const loginPromisifier = require(./loginPromisifier) // your path to it
app.use(loginPromisifier);
我希望这有帮助