gpt4 book ai didi

node.js - 未调用Nodejs Passport身份验证回调

转载 作者:IT老高 更新时间:2023-10-28 22:05:35 24 4
gpt4 key购买 nike

使用 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”。

我也试过 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});
});

最佳答案

您完全理解它,并且它按预期工作。

如果发生任何错误,Passport 会立即 next() 出现该错误。如果您想以自定义方式处理该错误,您可以使用错误处理中间件(详情:http://expressjs.com/guide/error-handling.html)。

自定义回调主要用于处理身份验证成功或失败(user == false)。错误,如 DB 连接等,不会传递回回调,有利于上述错误处理中间件。我考虑过改变这一点,但还没有找到令人信服的理由。但是,如果您有上述未涵盖的用例,请告诉我。

关于node.js - 未调用Nodejs Passport身份验证回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12217881/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com