gpt4 book ai didi

javascript - 错误 : req#login requires a callback function Passport. js

转载 作者:行者123 更新时间:2023-11-30 20:48:20 24 4
gpt4 key购买 nike

我正在实现 Passport 重置,但 req.login 似乎不起作用。

这是我的路线

// Token URL :post
router.post('/users/reset/:token', (req, res, next) => {
if(req.body.password === req.body['password-confirm']) {
req.flash('error', 'Passwords do not match!');
res.redirect('/users/forgot');
}

User.findOne({
resetPasswordToken: req.params.token,
resetPasswordExpires: { $gt: Date.now() }
}, function(err, user) {
if(!user) {
req.flash('error', ' Password reset is invalid or has expired');
res.redirect(302, '/login');
}

const setPassword = promisify(user.setPassword, user);
setPassword(req.body.password);
user.resetPasswordToken = undefined;
user.resetPasswordExpires = undefined;
const updatedUser = user.save();

req.login(updatedUser);

req.flash('success_msg', 'Your password has been reset successfully! You are now logged in!');
return res.redirect('/dashboard' + req.user);
});
});

这是日志

Thu Jan 25 2018 22:45:10 GMT+0000 (GMT): GET /users/reset/3eab13651335967925c180427bfb2ccc956187be
Mongoose: users.findOne({ resetPasswordExpires: { '$gt': new Date("Thu, 25 Jan 2018 22:45:10 GMT") }, resetPasswordToken: '3eab13651335967925c180427bfb2ccc956187be' }, { fields: {} })
Thu Jan 25 2018 22:45:10 GMT+0000 (GMT): GET /favicon.ico
Thu Jan 25 2018 22:45:20 GMT+0000 (GMT): POST /users/reset/3eab13651335967925c180427bfb2ccc956187be
Mongoose: users.findOne({ resetPasswordExpires: { '$gt': new Date("Thu, 25 Jan 2018 22:45:20 GMT") }, resetPasswordToken: '3eab13651335967925c180427bfb2ccc956187be' }, { fields: {} })
events.js:136

throw er; // Unhandled 'error' event
^

Error: req#login requires a callback function
at IncomingMessage.req.login.req.logIn (/Users/benbagley/Code/poetry-out-loud/node_modules/passport/lib/http/request.js:47:44)
at /Users/benbagley/Code/poetry-out-loud/routes/users.js:326:9
at model.Query.<anonymous> (/Users/benbagley/Code/poetry-out-loud/node_modules/mongoose/lib/model.js:4056:16)
at /Users/benbagley/Code/poetry-out-loud/node_modules/kareem/index.js:273:21
at /Users/benbagley/Code/poetry-out-loud/node_modules/kareem/index.js:131:16
at process._tickCallback (internal/process/next_tick.js:150:11)
[nodemon] app crashed - waiting for file changes before starting...

最佳答案

在 mongoose 中,Model.save() 是异步的(因为到达数据库和返回数据库需要时间)。当您执行以下操作时...

const updatedUser = user.save();

req.login(updatedUser);

您没有将 updatedUser 传递给 req.login - 您传递的是 Unresolved Promise。这就是登录功能失败的原因。 req.login也是异步的!

在使用它们的结果之前,您需要等待函数完成。您可以通过三种方式做到这一点:

1) 回调函数 - 这是您作为第二个参数传递给 User.findOne 的函数。

user.save((saveError, updatedUser) => {
// Check if saveError is present here and handle appropriately
req.login(updatedUser, loginError => {
req.flash('success_msg', 'Your password has been reset successfully! You are now logged in!');
res.redirect('/dashboard' + req.user);
})
});

2) 在返回的 promise 上调用 .then,并传递一个函数给 then,当 promise resolve 时执行

 user.save()
.then(updatedUser => req.login(updatedUser))
.then(() => {
req.flash('success_msg', 'Your password has been reset successfully! You are now logged in!');
res.redirect('/dashboard' + req.user);
})
.catch(err => /* handle error */);

3) 使用 async/await 并等待 promise 的解决。整个函数需要标记为异步,然后我们可以await任何返回 promises 的函数:

router.post('/users/reset/:token', async (req, res, next) => {
try {
if(req.body.password === req.body['password-confirm']) {
req.flash('error', 'Passwords do not match!');
res.redirect('/users/forgot');
}

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');
res.redirect(302, '/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_msg', 'Your password has been reset successfully! You are now logged in!');
return res.redirect('/dashboard' + req.user);
} catch (err) {
// handle error
}
});

关于javascript - 错误 : req#login requires a callback function Passport. js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48453792/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com