2016-07-12 12 views
4

Ich habe die local Strategie eingerichtet, aber failureRedirect scheint nicht richtig zu funktionieren. Wenn ein Verbindungsfehler auftritt (z. B. wenn die URL der Datenbank falsch ist), lautet die Antwort 500 statt auf die angegebene Route.Express Passport failureRedirect funktioniert nicht

Das ist mein Weg Code:

router.route('/login') 
    .post(passport.authenticate('local', { 
     failureRedirect: '/' 
    }), function(req, res){ 
     console.log('user logged in'); 
     res.redirect('../console'); 
    }); 

Und hier ist meine Implementierung für die local Strategie:

module.exports = function(){ 
    passport.use(new LocalStrategy({ 
     usernameField: 'email', 
     passwordField: 'password' 
    }, 
     function(email, password, done){ 
      pg.defaults.ssl = true; 
      pg.connect(process.env.DATABASE_URL, function(err, client) { 
       if (err){ 
        console.log('Connection issue when logging in: ' + JSON.stringify(err)); 
        done('Error with database,', null); // this is the problem area!!! 
       } else { 
        client 
         .query(`SELECT * FROM agent WHERE email='${email}'`, function(err, result) { 
          if(err || result.rows.length === 0) { 
           console.log('Query issue when loggin in: '+ JSON.stringify(err)); 
           done(null, false); 
          } else { 
           var user = result; 
           console.log('ready to log user in'); 
           done(null, user); 
          } 
         }); 
       } 
      }); 
     } 
    )); 
}; 

Ich dachte, vielleicht meine Verwendung von done() Callback-Funktion falsch ist, aber ich folgte die Dokumentation. Danke für Ihre Hilfe.

+0

versuchen 'fertig (err)'? –

+1

danke, aber funktioniert nicht wie erwartet: es druckt den Fehler auf der Seite statt Umleiten an wie in 'failureRedirect' angegeben – ocram

+0

cool, jetzt, was ist der Fehler? –

Antwort

1

Das Problem, das ich hatte, war, dass ich einen Fehler warf, wenn der Benutzer nicht existierte - done('some error', null); und das scheint nicht zu sein, was Passport erwartet.

Es unterstützt die Vorstellung eines falschen Benutzers als ein weiteres Zeichen des Scheiterns. Die entsprechende Signatur wäre also done(null, null), wenn Sie keinen Benutzer finden.

Wenn Sie also einen Datenbankfehler haben, setzen Sie 'Fehler mit Datenbank' als Fehler. Du solltest null setzen.

+0

die done params sind 'done (err, user, options)' und 'options' können einen message param nehmen. Also, wenn es eine Ausnahme gibt, passiere das durch 'err', wenn es keinen Benutzer gibt, gib 'user' als' false' zurück und setze Optionen wie '{message:" no so user "}' – Mr5o1

+0

Ich habe immer noch Probleme, wenn Fehler ist nicht null und Benutzer ist falsch. Es funktioniert, wenn err auf Null gesetzt ist. 'done (null, false, {Nachricht:" kein solcher Benutzer "})' funktioniert gut. – Nabil

Verwandte Themen