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

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")); 
        }
    }
});

逻辑说明

  1. 对于无token的情况,用else包裹后续所有逻辑,确保调用错误处理后不会进入try块
  2. 对于非管理员用户,同样用else包裹正常流程的next(),确保错误处理执行后不会触发正常路由流程
  3. 这种方式通过分支互斥替代return,实现了错误路径与正常路径的完全隔离,避免重复发送响应

内容的提问来源于stack exchange,提问作者Alireza Azizkhani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 05:53:32