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を使用すると、コンソールに「認証前」、「認証機能内」、「コールバック認証」の順に表示されるはずですが、最初の2つ、「errortest」、「errortest」の順に表示されます。ブラウザに「」が表示されます。
また、試してみたところreturn done({'message':'test'});
、コンソールとブラウザに「[objectObject]」が表示されていました。
これは正しく機能していませんか、それとも何かが足りませんか?
編集:Jared Hansonの応答に従って、このエラーハンドラー関数をapp.get()の3番目の引数として追加すると、エラーをキャッチして適切なjsonを返すことができます。
...
})(req, res, next);
},
function(err, req, res, next) {
// failure in login test route
return res.send({'status':'err','message':err.message});
});