【发布时间】:2018-08-06 00:50:26
【问题描述】:
我正在尝试发出需要很长时间(2-5 米)的获取请求,但大约 1 分 30 秒后我在 Chrome 控制台中收到此错误消息:
加载资源失败:net::ERR_EMPTY_RESPONSE
所以,我尝试将我的 XHR 请求包装在一个计时器中,如下所示:
客户端代码:
xhr.open('GET', '/refresh', true);
xhr.timeout = 600000;
xhr.onload = function () {
window.location.reload();
};
xhr.send(null);
服务器端代码:
app.get("/refresh", (req, res) => {
var process = spawn('python3', ["scrape.py"]);
process.stdout.on('data', function (data){
console.log("-> " + data.toString());
if ((data.toString().indexOf("done") > -1)) {
res.json({done: "done"});
}
});
});
但我在大约 1 分 30 秒后仍然收到同样的错误,而且控制台日志“超时”.. 为什么?
如果我用一个持续 20 秒的 Python 脚本运行完全相同的代码,它会完美运行。
谢谢
【问题讨论】:
-
响应实际返回什么?我注意到如果响应的状态为 200 但没有响应主体(包括
\n),Chrome 会抛出,这在技术上是反规范的(因为\n\n用于告诉用户代理响应已终止)。所以 1m30 可能是内部 Chrome 超时“我得到 200 OK,等待正文,等待正文等待正文。”如果端点不想发送正文,它必须发送状态 204。 -
window.location.reload将重新获取/refresh。看起来您没有使用 websockets,这意味着每次获取都是无状态的,因此您的客户端超时什么也不做(chrome 将超时等待响应,因为您的超时只是重新加载 uri)。
标签: javascript python node.js reactjs fetch