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

Express跳转触发ERR_HTTP_HEADERS_SENT错误,求原因及解决方法

错误原因分析与修复方案

这个错误Error [ERR_HTTP_HEADERS_SENT]的核心是:在同一个HTTP请求中,你尝试多次发送响应头/响应内容。HTTP协议要求一个请求只能对应一个完整响应,重复发送就会触发这个报错。

你的代码里有两处关键问题:


1. /login 路由里的重复响应

在登录路由中:

  • 登录成功时,response.redirect('Admin')已经会自动发送响应并结束请求,但之后你又调用了response.end(),属于第二次结束请求。
  • else分支里,response.send()本身就会自动结束响应,后续的response.end()完全多余,是重复操作。

2. /Admin 路由里的异步操作后重复响应

在Admin路由中:

  • 用户已登录时,activeEmails()是异步Promise操作,你在then里调用res.render(),但不管异步操作是否完成,函数最后都会执行res.end()。res.render()是异步的,它会在模板渲染完成后自动发送响应并结束请求,此时再执行res.end()就会导致重复发送响应头。
  • 未登录分支里的res.redirect('login')同样会自动结束请求,后续的res.end()也是多余的重复操作。

修正后的代码

修正后的 /login 路由:

app.post('/login', function(request, response) {
    let username = request.body.username;
    let password = request.body.password;
    console.log(username);
    console.log(password);

    if (username && password) {
        con.query('SELECT * FROM something WHERE user = ? AND password = ?', [username, password], function(error, results, fields) {
            if (error) throw error;
            if (results.length > 0) {
                request.session.loggedin = true;
                request.session.username = username;
                response.redirect('Admin'); // redirect会自动结束响应,无需再调用end()
            } else {
                response.send('Incorrect Username and/or Password!'); // send会自动结束响应
            }
            // 移除多余的response.end()
        });
    } else {
        response.send('Please enter Username and Password!'); // send会自动结束响应
        // 移除多余的response.end()
    }
});

修正后的 /Admin 路由:

app.get('/Admin', function (req, res) {
    if (req.session.loggedin) {
        activeEmails()
        .then((result) => {
            var email = result;
            console.log(email);
            res.render('Admin', { // render完成后自动结束响应
                email : email
            });
        });
    } else {
        res.redirect('login'); // redirect会自动结束响应
    }
    // 移除函数末尾的res.end()
});

补充说明

Express的res.redirect()、res.send()、res.render()这些方法内部都会自动调用res.end()来结束请求,所以你不需要手动再调用一次,否则就会触发重复发送响应的错误。

内容的提问来源于stack exchange,提问作者Jeremiah Rodriguez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:15:51