使用的NodeJS護照,我是測試出來的時候發生了錯誤條件使用下面的代碼會發生什麼:的NodeJS護照驗證回調不被稱爲
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用戶名=鮑勃&密碼= S?我希望在控制檯中看到「驗證之前」,然後「驗證功能」,然後「驗證回調」,但它只顯示前兩個「errortest」,並在瀏覽器中顯示「errortest」。
我也試過return done({'message':'test'});
,並且在控制檯和瀏覽器中顯示「[object object]」。
這是行不通還是我錯過了什麼?
編輯:按照賈裏德·漢森的迴應,增加這個錯誤處理功能的第三個參數app.get()讓我趕上了錯誤並返回相應的JSON:
...
})(req, res, next);
},
function(err, req, res, next) {
// failure in login test route
return res.send({'status':'err','message':err.message});
});
感謝您的快速反應。我對node.js相當陌生,但用例通過jquery ajax調用進行登錄。我想返回一個json對象,其狀態爲:'ok'成功,'失敗'用戶名/密碼錯誤,'err'如果發生錯誤。 (請注意我爲成功所做的代碼編輯。) – KevinVictor
因此,當自定義回調被調用時,err是否始終爲空? – KevinVictor
發佈了關於GitHub問題的後續工作,所以我可以更好地對代碼進行格式化。 https://github.com/jaredhanson/passport-local/issues/15 –