如何解决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
相关产品推荐
相关产品推荐

