代码之家  ›  专栏  ›  技术社区  ›  Sunil Garg

如何制作应用程序。在NodeJ中使用同步

  •  0
  • Sunil Garg  · 技术社区  · 8 年前

    我用express framework创建了一个nodejs应用程序。有一些途径,我正在使用passport库进行身份验证。这是我的登录url映射

    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");
    }
    

    但是 登录Handler 方法未在请求对象中获取用户对象,因为 应用程序。使用 是异步的。我如何解决这个问题?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Himanshu sharma    8 年前

    编辑您的代码并进行此更改。

    // 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() 同步方式。添加 下一个() 在护照区内,您可以通过 req.user 完美地

        2
  •  0
  •   Sunil Garg    8 年前

    从@Himanshu的回答来看,我需要使用 next() 方法内部的passports authenticate回调函数。这是可行的,但对于其他请求,仍然需要 下一个() 作用所以最新的答案是

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