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); });