You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 16:47:27