2017-11-20 2 views
0

Ich habe eine Nodejs App mit dem Express-Framework erstellt. Es gibt einige Routen und ich benutze Pass-Bibliothek für die Authentifizierung. Hier ist mein Login-URL-Mappingwie man app.use in nodejs synchron macht

app.post('/login', loginHandler); 

und vor diesem, habe ich verwendet 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(); 
}); 

und in meiner loginHandler

function loginHandler(req: any, res: any) { 
    console.log("user", req.user) 
    if (!req.user) { 
     console.log("NoUser") 
    } else { 
     res.redirect("/home"); 
} 

aber loginHandler Methode nicht Benutzerobjekt in Request-Objekt bekommt weil app.use asynchron ist. Wie kann ich das lösen?

+0

Markieren Sie es, wenn das Ihr Problem löst. Ich habe auch anderen Zustand hinzugefügt. –

Antwort

0

Wie aus dem @ Himanshu Antwort zu passieren, ich brauche next() Methode innerhalb der Pässe authentifizieren Callback-Funktion zu verwenden. Das funktioniert aber für andere Anfragen, da noch eine next() Funktion benötigt wird. So ist die aktualisierte Antwort

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

}); 
1

Bearbeiten Sie Ihren Code und nehmen Sie diese Änderung vor.

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

}); 

Der Code ist richtig, aber Sie rufen next() synchrone Art und Weise. In next() innerhalb des Pass-Block ermöglicht Ihnen die req.user perfekt

Verwandte Themen