如果HTTP状态是错误代码,则Chrome无法下载响应正文

时间:2017-12-07 10:16:29

标签: http express google-chrome-devtools

我有一个Node.js Express Web服务器,当出现问题时,它会返回HTTP响应JSON有效负载以及错误状态(4xx或5xx)。

res.status(500).json({ error: 'message' });

在Chrome浏览器开发者控制台的时间部分,我可以看到很多时间(最多5分钟)花在"内容下载"段,最终我得到"无法加载响应数据"在下载失败后的响应部分中。

Chrome developer console timing output

Firefox和Opera等其他浏览器能够成功成功下载JSON有效负载并将其显示在各自的开发者控制台中。

如果我将HTTP状态发回200,则Chrome可以轻松下载有效内容。

此外,如果我没有将Cache-Control HTTP标头设置为" no-store,no cache ...",则Chrome能够成功下载4xx / 5xx状态的有效负载。但是,我想将此标头设置为防止缓存滥用的良好做法。

HTTP Response Headers in the success and failure case

我需要为Chrome做些具体的事情吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

我刚刚遇到了类似的问题。对于请求,我使用了 fetch API,如果出现错误,我没有读取响应正文的流。

响应正文的内容既没有显示在开发工具中,也没有包含在 HAR 导出中。

在控制台中调试之后,我注意到内容会在我阅读流时立即显示在响应或预览选项卡中。 (例如:await response.text()

奇怪的是,当未设置相应的缓存标头时,行为会发生变化。

答案 1 :(得分:0)

就我而言,它发生在没有任何东西等待响应正文的时候。

之前(预览选项卡中未呈现正文):

async request(context: RequestOpts): Promise<Response> {
    // ...
    const response = await this.fetchApi(url, init);
    if (response.status >= 200 && response.status < 300) {
        return response;
    }
    throw new Error();
}

之后:

async request(context: RequestOpts): Promise<Response> {
    // ...
    const response = await this.fetchApi(url, init);
    if (response.status >= 200 && response.status < 300) {
        return response;
    }
    throw await response.json();
}