我使用express框架创建了一个nodejs应用程序。有一些路线,我使用护照库进行身份验证。这是我的登录网址映射
app.post('/login', loginHandler);
在此之前,我使用了app.use
// middleware to use passport strategy
app.use((req: any, res: any, next: any) => {
if (req.originalUrl == '/login') {
passport.authenticate('local', { session: false }, (err, user) => {
if (user) {
req.user = user;
}
})(req, res, next);
}
next();
});
并在我的loginHandler
function loginHandler(req: any, res: any) {
console.log("user", req.user)
if (!req.user) {
console.log("NoUser")
} else {
res.redirect("/home");
}
但是loginHandler
方法不会在请求对象中获取用户对象,因为app.use
是异步的。我该如何解决这个问题?
答案 0 :(得分:1)
编辑您的代码并进行此更改。
// middleware to use passport strategy
app.use((req: any, res: any, next: any) => {
if (req.originalUrl == '/login') {
passport.authenticate('local', { session: false }, (err, user) => {
if (user) {
req.user = user;
}
next(); ////// change is here
})(req, res, next);
}else{
next();
}
});
代码正确但您以同步方式调用next()
。在护照区块内添加next()
将允许您完美地传递req.user
答案 1 :(得分:0)
从@Himanshu的回答中,我需要在护照验证回调函数中使用next()
方法。这适用于其他请求,仍然需要next()
函数。所以更新的答案是
// middleware to use passport strategy
app.use((req: any, res: any, next: any) => {
if (req.originalUrl == '/login') {
passport.authenticate('local', { session: false }, (err, user) => {
if (user) {
req.user = user;
}
next();
})(req, res, next);
} else {
next();
}
});