Ich hatte ein Problem sehr ähnlich, also poste ich das für den Fall, dass es hilft. Das Problem schien zu sein, dass ich eine andere Funktionsdefinition innerhalb der Pass-Funktion hatte, und dies verhinderte, dass der Done-Handler aufgerufen wurde. Ich denke, das war das Problem, denn als ich die Funktionsargumentnamen änderte, begannen die Dinge zu funktionieren.
Im Nachhinein denke ich der Fehler ist offensichtlich, aber da ich neu zu Knoten bin bin ich immer noch ein bisschen unsicher mit Funktionen, Callbacks, Schließungen, etc., usw. Ich habe auch den Eindruck, dass die Knoten Konvention immer ist um diese Argumentnamen zu verwenden (err, done, next) und dass mit ihnen etwas Magie verbunden ist. Ich denke nicht. Fühlen Sie sich frei, mich zu diesem Punkt zu erziehen.
Wie auch immer, ich benutzte eine Passport-Local-Strategie, die ich von einem Tutorial kopiert habe (um http://scotch.io/tutorials/javascript/easy-node-authentication-setup-and-local). Das Tutorial verwendete mongo, aber ich entschied mich, zu postgresql zu wechseln. Also habe ich den pg benutzt.js-Modul von https://github.com/brianc/node-postgres-pure, und verwendete den mitgelieferten Beispielcode.
Hier ist der relevante Teil des Codes, nachdem ich zunächst den pg.js Beispielcode in den Pass Tutorial kopiert und eingefügt:
// Bad-Code
passport.use('local', new LocalStrategy({
// by default, local strategy uses username and password, we will override with email
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true // allows us to pass back the entire request to the callback
},
function(req, email, password, done) {
pg.connect(configDB.connectionString, function(err, client, done) {
if (err) {
return console.error('could not connect to postgres', err);
}
client.query('select email, password_hash from admin_user where email = $1', [email], function(err, result) {
// check password against db, and then try to call passports done callback
return done(null, userModel); // this actually invokes the pg.connect done callback
});
});
}));
Also, wenn dies läuft, auf der Post zurück zu/login, der Aufruf zu getan würde aufrufen pg.connect getan, nicht Pass gemacht.
// Gut? Code arbeiten
function(req, email, password, done) {
pg.connect(configDB.connectionString, function(err, client, connect_done) {
if (err) {
return console.error('could not connect to postgres', err);
}
client.query('select email, password_hash from admin_user where email = $1', [email], function(err, result) {
connect_done() // free up postgres connection, which I should have been doing before
// check password against db, and then
return done(null, userModel); // invoke passport's done callback
});
});
}));
Dieser Code jetzt für mich arbeitet (es sei denn, ich etwas falsch kopiert).
Passt das Formular zur richtigen Route? Überprüfen Sie in den Entwickler-Tools Ihres Browsers, ob die richtige Route tatsächlich angefordert wird. Sonst sieht der Code gut für mich aus –
Ja, ich habe im Netzwerk eingecheckt. Ich habe es sogar ein bisschen verändert, falls ich verrückt werden sollte. Ein guter Ruf. –
Sind Sie sicher, dass Sie in Ihrer Postroute 'adminRoute.create' eine Antwort zurücksenden? Sie müssen sicher sein, dass Sie die Antwort beenden. – user568109