我正在使用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);
});
使用路由 /logintest?username=bob&password=s,我期望在控制台中看到 "before authenticate" 然后是 "in auth function" 再然后是 "authenticate callback",但实际上只显示前两个,接着是 "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});
});