res.sendFile() 错误 [ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头

Sti*_*boi 5 runtime-error http-headers node.js express server

我正在使用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);
});
Run Code Online (Sandbox Code Playgroud)

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'});
});
Run Code Online (Sandbox Code Playgroud)

仅当我使用 res.sendFile() 时才会出现该错误。一旦加载,index.html将请求一个index.js文件。也许这就是问题所在?但这不是一个不同的要求吗?

谢谢你!

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

boo*_*lse 3

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();
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

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