使用 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 我希望在控制台中看到,“在验证之前”然后是“在验证函数中”然后是“验证回调”,但它只显示前两个,然后是“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});
});