使用Nodejs Passport,我正在使用以下代码测试出现错误情况时会发生什么:
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我希望在控制台中看到“在验证之前”然后“在auth函数中”然后“验证回调”但它只显示前两个后跟“errortest” “和”errortest“显示在浏览器中。
我也尝试了return done({'message':'test'});
,并且在控制台和浏览器中显示了“[object Object]”。
这不能正常工作还是我错过了什么?
编辑:根据Jared Hanson的回复,将此错误处理函数添加为app.get()的第三个参数允许我捕获错误并返回相应的json:...
})(req, res, next);
},
function(err, req, res, next) {
// failure in login test route
return res.send({'status':'err','message':err.message});
});
答案 0 :(得分:17)
你完全理解它,并按预期工作。
如果发生任何错误,Passport立即next()
出现该错误。如果要以自定义方式处理该错误,可以使用错误处理中间件(详细信息:http://expressjs.com/guide/error-handling.html)。
自定义回调主要用于处理身份验证成功或失败(user
== false
)。错误(如DB连接等)不会传递回回调,有利于上述错误处理中间件。我考虑过改变它,但没有找到令人信服的理由。但是,如果你有一个上面没有涉及的用例,请告诉我。
答案 1 :(得分:6)
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);
});
答案 2 :(得分:2)
我遇到了同样的问题。然后放,
const bodyParser=require('body-parser');
app.use(bodyParser.urlencoded({extended:false}));
app.use(bodyParser.json());