我遇到了与此非常相似的问题,因此我将其发布以防万一。问题似乎是我在护照函数中有另一个函数定义,这阻止了完成处理程序被调用。我认为这是问题所在,因为当我更改函数参数名称时,事情就开始起作用了。
事后看来,我认为错误很明显,但由于我是 node 新手,我对函数、回调、闭包等仍然有点不确定。我也有这样的印象,即 node 约定总是使用这些参数名称(错误,完成,下一个),并且有一些与它们相关的魔法。我想不是。随时教育我这一点。
无论如何,我使用的是从教程中复制的护照本地策略(在http://scotch.io/tutorials/javascript/easy-node-authentication-setup-and-local)。本教程使用 mongo,但我决定切换到 postgresql。所以我使用了https://github.com/brianc/node-postgres-pure中的 pg.js 模块,并使用了提供的示例代码。
这是代码的相关部分,在我最初将 pg.js 示例代码复制并粘贴到护照教程中之后:
//错误代码
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
});
});
}));
因此,当它运行时,在返回 /login 的帖子上,对 done 的调用将调用 pg.connect done,而不是护照完成。
// 好的?工作代码
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
});
});
}));
这段代码现在对我有用(除非我复制错误)。