Nodejs Passportvalidationcallback没有被调用

使用Nodejs Passport,我testing了使用以下代码发生错误时会发生什么情况:

passport.use(new LocalStrategy( function(username, password, done) { // asynchronous verification, for effect... process.nextTick(function () { findByUsername(username, function(err, user) { console.log('in auth function'); return done('errortest'); if (err) { return done(err); } if (!user) { return done(null, false, { message: 'Unknown user ' + username }); } if (user.password != password) { return done(null, false, { message: 'Invalid password' }); } return done(null, user); }) }); } )); app.get('/logintest', function(req, res, next) { console.log('before authenticate'); passport.authenticate('local', function(err, user, info) { console.log('authenticate callback'); if (err) { return res.send({'status':'err','message':err.message}); } if (!user) { return res.send({'status':'fail','message':info.message}); } req.logIn(user, function(err) { if (err) { return res.send({'status':'err','message':err.message}); } return res.send({'status':'ok'}); }); })(req, res, next); }); 

我使用route / logintest?username = bob&password = s我期望在控制台中看到“validation之前”,然后“validationfunction”,然后“validationcallback”,但只显示前两个“errortest”和“errortest “显示在浏览器中。

我也尝试return done({'message':'test'}); 并在控制台和浏览器中显示“[object object]”。

这是不是正常工作,或者我错过了什么?

编辑:根据Jared Hanson的回应,添加这个error handling函数作为app.get()的第三个参数允许我捕捉错误并返回适当的json:

 ... })(req, res, next); }, function(err, req, res, next) { // failure in login test route return res.send({'status':'err','message':err.message}); }); 

你完全理解它,并按预期工作。

如果发生任何错误,护照会立即出现next()的错误。 如果要以自定义的方式处理该错误,则可以使用error handling中间件(详细信息: http : //expressjs.com/guide/error-handling.html )。

自定义callback主要用于处理authentication成功或失败( user == false )。 错误,如数据库连接等,不会传回到callback,有利于上述error handling中间件。 我考虑过改变这个,但还没有find一个令人信服的理由。 但是,如果你有一个不在上述范围内的用例,请告诉我。

bodyparser.json()导致我的问题,我通过设置每个路由(具体在护照路线),如下所示:

 app.post('/login', bodyParser.urlencoded({ extended: true }), function (req, res, next) { passport.authenticate('local', function (err, user, info) { if (err) { return next(err) } if (!user) { console.log('bad'); req.session.messages = [info.message]; return res.redirect('/login') } req.logIn(user, function (err) { console.log('good'); if (err) { return next(err); } return res.redirect('/'); }); })(req, res, next); });