2016-09-21 2 views
0

Ich schreibe Middleware, um Benutzeranmeldeinformationen bei jedem Anruf zu überprüfen.Funktionsausführung wird in der Mitte gestoppt

Wie es funktioniert: Ich bekomme ID-Token vom Benutzer. Nach wem wurde ein Token erstellt? Wenn die Daten korrekt sind - speichere ich sie für zukünftige Verwendung.

middleware = function(req, res, next) { 
    var storage = {}; 
    storage.ip = req.ip; 
    storage.logged = false; 
    storage.username = 'Guest'; 


    if(req.headers.authorization) { 

    var base64Id = req.headers.authorization.split(' '); 


    try { 

     var decoded = jwt.verify(base64Id[1], app.get('salt')); 
     console.log('decoded',decoded); 

     Token.findOne({ jti: decoded.abc }, function(err, token) { 
     if (err) { 
      console.log(err); 
     } 

     if(token.browser !== req.headers['user-agent'] || req.ip !== token.ip) { 
      console.log('incydent: niezgodność ip lub przeglądarki'); 
     } else { 
      User.findOne({_id: token.iss}, function(err, user) { 
      if(err) { 
       console.log(err); 
      } 
      if(user.name === decoded.name) { 
       console.log('data are correct'); 
       storage.username = user.name; 
       storage.logged = true; 
      } else { 
       console.log('data are wrong'); 
      } 
      }); 

      console.log('next step'); 
     } 

     }); 

    } catch(err) { 
     if(err.name === 'TokenExpiredError') { 
     token.deactivate(); 
     } else { 
     console.log('ERROR!',JSON.stringify(err,null,4)) 
     } 
    } 

    } 
    req.storage = storage; 
    next(); 
}; 

Auf Konsole, meine letzte Zeile ist ‚Daten korrekt sind‘, und Linie mit console.log('next step'); nie ausgeführt wurde. Es werden auch keine Fehler auf die Konsole geworfen.

+2

richtig einrücken Code immer schief geht hilft – qxz

Antwort

0

Token.findOne ist eine asynchrone Funktion (Sie geben es einen Rückruf).

So sind die Schritte:

  • Middleware Geben Sie
  • Anruf Token.findOne
  • Anruf next (letzte Zeile des Codes)
  • Token.findOne ‚s Rückruf aufgerufen wird (aber Ihre Anwendung ist bereits in die nächsten Middlewares)

Sie sollten:

  • Verschieben next() wo Sie console.log('next step'); (und löschen Sie diese letzte Zeile) log
  • eine next(err) im catch-Block hinzufügen Fehler zu propagieren, wenn etwas
Verwandte Themen