如何在nodejs

时间:2017-11-20 05:52:53

标签: node.js express asynchronous

我使用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是异步的。我该如何解决这个问题?

2 个答案:

答案 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();
   }

});