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

如何解决Error: req#logout requires a callback function及登出报错问题

登出功能错误排查与解决

错误1:req#logout requires a callback function

成因

Passport.js 0.6.0及以上版本中,req.logout()(包括别名req.logOut())已改为异步方法,必须传入回调函数,同步调用的方式被移除,直接调用req.logOut()会触发该错误。

错误2:Cannot DELETE /logout

成因

你修改后的代码将路由改为了app.post('/logout'),但前端表单依然通过?_method=DELETE发送DELETE请求,Express无法匹配到对应的POST路由,因此返回404错误。

完整解决方案

需要同时修正路由方法和req.logout()的调用方式,确保前后端请求与路由匹配:

方案1:保持DELETE路由(与表单的_method一致)

修改app.js中的登出路由,使用回调式的req.logout():

const methodOverride = require('method-override')
app.use(methodOverride('_method'))

app.delete('/logout', (req, res, next) => {
  req.logout(function(err) {
    if (err) { return next(err); }
    res.redirect('/login');
  });
})

前端表单无需修改:

<form action="/logout?_method=DELETE" method="POST">
   <button type="submit">Log out</button>
</form>

方案2:改用POST路由(简化请求方式)

将前端表单的?_method=DELETE移除,同时把后端路由改为POST方法:

app.post('/logout', (req, res, next) => {
  req.logout(function(err) {
    if (err) { return next(err); }
    res.redirect('/login');
  });
})

前端表单:

<form action="/logout" method="POST">
   <button type="submit">Log out</button>
</form>

内容的提问来源于stack exchange,提问作者Andrei Sorokin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:10:12