使用passport-local-mongoose时User.register回调函数未执行问题
问题原因及修复方案
你的代码存在语法错误,导致回调函数根本没有被传入User.register方法中,所以回调里的代码不会执行。
错误点分析
你在调用User.register时,提前闭合了方法的括号:
User.register({ username: req.body.username }, req.body.password), function (err, user) { ... }
这里的)直接结束了User.register的调用,后面的function(err, user){...}变成了一个独立的、未被调用的函数表达式,完全和register方法无关。这就解释了为什么用户能被存入数据库(register确实执行了),但回调里的console.log和后续逻辑都没触发。
修正后的代码
把回调函数作为第三个参数传入User.register,确保括号在回调函数之后闭合:
app.post("/register", async (req, res) => { console.log("req body username is : " + req.body.username); console.log("req body password is : " + req.body.password); // 修正括号位置,将回调作为第三个参数传入 User.register({ username: req.body.username }, req.body.password, function (err, user) { console.log("This string is supposed to be displayed."); if (err) { console.log("Error in User registration", err); } else { passport.authenticate("local")(req, res, function () { res.send("you are registered.") console.log("passport authenticate works."); }) } }); });
额外说明
因为passport-local-mongoose的register方法支持Promise语法,你也可以用async/await来替代回调写法,避免这类语法错误:
app.post("/register", async (req, res) => { console.log("req body username is : " + req.body.username); console.log("req body password is : " + req.body.password); try { const user = await User.register({ username: req.body.username }, req.body.password); console.log("This string is supposed to be displayed."); passport.authenticate("local")(req, res, function () { res.send("you are registered.") console.log("passport authenticate works."); }); } catch (err) { console.log("Error in User registration", err); } });
内容的提问来源于stack exchange,提问作者koji tanaka
相关产品推荐
相关产品推荐

