调用req.logout()时触发“req#logout requires a callback function”错误的原因及解决方案咨询
嘿,这个问题我之前踩过坑!其实是Passport.js版本更新带来的变化导致的,我来给你拆解下~
错误原因
你当前使用的应该是Passport.js 0.6.0及以上版本,这个版本之后官方把req.logout()从同步方法改成了异步方法,要求必须传入一个回调函数来处理登出过程中可能出现的错误,不再支持无参数的同步调用方式,这就是你收到Error: req#logout requires a callback function错误的核心原因。
解决方法
这里给你两种可行的修复方案:
方案1:直接传入回调函数(最基础写法)
按照新版本的要求,给req.logout()添加回调函数,在回调里处理错误和后续跳转:
// @desc 登出用户 // @route GET /auth/logout router.get("/logout", (req, res)=>{ req.logout((err) => { // 处理登出过程中可能出现的错误 if (err) { return res.status(500).send("登出失败,请稍后重试"); } // 登出成功后跳转首页 res.redirect("/"); }); })
方案2:用async/await简化异步逻辑(更优雅)
如果你习惯用async/await风格的代码,可以把req.logout()包装成Promise来使用:
// @desc 登出用户 // @route GET /auth/logout router.get("/logout", async (req, res)=>{ try { // 将回调式的logout包装为Promise await new Promise((resolve, reject) => { req.logout((err) => { err ? reject(err) : resolve(); }); }); // 登出成功跳转 res.redirect("/"); } catch (err) { // 捕获错误并处理 res.status(500).send("登出失败,请稍后重试"); } })
另外补充一句:如果你之前用的是低于0.6.0的Passport版本,原来的写法确实能正常运行,但官方已经不推荐旧版本了,建议升级到新版本并使用上述回调写法,因为旧版本存在一些安全隐患哦。
内容的提问来源于stack exchange,提问作者user17306349
相关产品推荐
相关产品推荐

