如何在最新版passport-local-mongoose注册时用local策略认证用户?
问题:注册后passport.authenticate未执行,无法完成用户认证
错误原因分析
你的代码存在语法逻辑错误,导致passport.authenticate("local")完全没有触发认证流程:
- 你在
passport.authenticate("local")后使用了逗号,使得后面的箭头函数变成了一个独立、未被调用的表达式,完全没有和认证逻辑关联。 - 即便去掉逗号,也没有正确调用
passport.authenticate返回的中间件函数——该函数必须传入当前请求的req、res参数才能启动认证流程。
修正后的代码
将你的/register路由修改为:
app.post("/register", (req, res) => { User.register({ username: req.body.username }, req.body.password) .then((user) => { console.log("Check user Registeration success"); // 正确调用passport.authenticate,传入req、res和认证完成后的回调 passport.authenticate("local")(req, res, () => { console.log("User is now Authenticated"); res.redirect("/secrets"); }); }) .catch((error) => { console.log(error); res.redirect("/register"); // 错误时重定向回注册页,优化用户体验 }); });
关键说明
- 认证函数调用逻辑:
passport.authenticate("local")会返回一个中间件函数,必须传入当前请求的req、res对象,才能触发local策略的认证流程,将用户登录状态写入session。 - 错误处理补全:在
catch块中添加重定向逻辑,避免用户在注册失败后停留在空白页面。 - 版本适配:最新版
passport-local-mongoose的User.register原生支持Promise写法,你的异步处理逻辑是正确的,只需修正认证函数的调用方式即可。
内容的提问来源于stack exchange,提问作者Ransike Randeni
相关产品推荐
相关产品推荐

