Node.js 异步/等待不';nodejs passport重置密码似乎不起作用
出于某种原因,我出现了以下错误: 错误: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) 使用此代码: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
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);
我希望这有帮助