【问题标题】:res.sendFile() Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the clientres.sendFile() 错误 [ERR_HTTP_HEADERS_SENT]: 发送到客户端后无法设置标头
【发布时间】:2021-07-21 02:43:36
【问题描述】:

我正在使用 express 构建一个简单的服务器。 一切正常,但每次我尝试硬刷新(cntr + R)我的页面时,我都会在控制台中遇到这个烦人的错误。

错误 [ERR_HTTP_HEADERS_SENT]:发送到客户端后无法设置标头

代码如下:

app.get('/index', (req, res) => {
    const filePath = path.join(__dirname, 'public', 'index.html');
    console.log(res.headersSent);
    res.sendFile(filePath);
});

console.log(res.headersSent) 用于检查是否确实未设置标题(每次都记录为 false)。

我尝试发送一个简单的 JSON 而不是一个文件,并且没有发生错误:

app.get('/index', (req, res) => {
    const filePath = path.join(__dirname, 'public', 'index.html');
    console.log(res.headersSent);
    res.json({status: 'All good'});
});

该错误仅在我使用 res.sendFile() 时发生。 index.html 将在加载后请求一个 index.js 文件。也许这就是问题?但这不是一个不同的要求吗?

谢谢!

编辑 我尝试检查 sendFile() 的回调函数中的错误。 它是未定义的,即使控制台不断吐出“无法设置标题”错误

【问题讨论】:

  • “但这不是一个不同的请求吗?”是的,但从你所说的听起来 index.js 端点可能会导致标头被发送两次。

标签: node.js express server http-headers runtime-error


【解决方案1】:

sendFile 是异步函数,所以需要在引擎读取文件后发送响应,但 json 是同步的(这就是它没有抛出错误的原因为此)。

换句话说,您需要从回调中发送响应,如下所示:

app.get('/index', (req, res) => {
    const filePath = path.join(__dirname, 'public/index.html');
    res.sendFile(filePath, function(err) {
        if (err) {
            return res.status(err.status).end();
        } else {
            return res.status(200).end();
        }
    });
});

欲了解更多信息,请阅读以下内容:

【讨论】:

  • 请注意,sendFile() 函数不只是读取文件 - 它实际上向客户端发送响应。您不应该尝试从回调中发送另一个响应。
  • 是的.. 用“return”发回响应也是一个好习惯
  • 我已经尝试使用回调,现在我得到了两次错误 XD。奇怪的是回调函数中的错误是未定义的
猜你喜欢
  • 1970-01-01
  • 2019-02-06
  • 2020-05-20
  • 2019-06-15
  • 2020-05-26
  • 2018-09-19
  • 2023-01-19
  • 2020-09-22
  • 2019-12-11
相关资源
最近更新 更多