Node.js解决Cannot set headers after sent错误(无需return)
解决ERR_HTTP_HEADERS_SENT错误(无需使用return)
问题根源
你遇到的错误是因为中间件调用next(new CustomError(...))后,代码未终止执行,后续的next()仍会被触发。这导致Express先通过错误处理器发送权限拒绝响应,随后正常流程又尝试发送一次响应,最终触发重复设置响应头的错误。
无需return的修复方案
通过条件分支互斥,让错误路径与正常逻辑路径完全分离,确保调用错误处理后不会进入后续正常流程。
修改后的adminAuth中间件代码
export const adminAuth = asyncMiddleware(async(req, res, next) => { const token = req.header('X-Auth-Token'); if (!token) { next(new CustomError("Access denied", 403, 'Forbidden')); } else { try{ const decoded = jwt.verify(token, process.env.JWT_TOKEN); req.user = decoded; if (!req.user.isAdmin) { next(new CustomError("User access denied", 400, "BadRequest")); } else { next(); } }catch(err){ next(new CustomError("Invalid token", 400, "BadRequest")); } } });
逻辑说明
- 对于无token的情况,用
else包裹后续所有逻辑,确保调用错误处理后不会进入try块 - 对于非管理员用户,同样用
else包裹正常流程的next(),确保错误处理执行后不会触发正常路由流程 - 这种方式通过分支互斥替代
return,实现了错误路径与正常路径的完全隔离,避免重复发送响应
内容的提问来源于stack exchange,提问作者Alireza Azizkhani
相关产品推荐
相关产品推荐

