【问题标题】:XHR request -> getting ERR_EMPTY_RESPONSEXHR 请求 -> 获取 ERR_EMPTY_RESPONSE
【发布时间】: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


【解决方案1】:

为防止浏览器因无响应而超时,您必须在超时(根据您的测试听起来像 90 秒)内向其发送响应。这意味着您的应用程序很可能需要重新设计。由于您看起来不像在使用 websockets,因此服务器上的所有内容都是无状态且同步的,因此您必须手动将请求设置为伪异步:

历史模式是:

  1. 衍生进程将其结果写入某处
  2. 服务器应在请求时返回一个令牌 (/refresh?token=1234),在结果就绪时返回结果,否则返回类似于状态 204 的内容。
  3. 在初始响应中返回令牌
  4. 在您的客户端中,您的超时一直在检查令牌,如果状态 == 204,则重置计时器,否则您有完整的响应并中断计时器。

【讨论】:

    猜你喜欢
    • 2012-01-18
    • 1970-01-01
    • 2011-12-22
    • 2017-03-21
    • 2020-05-17
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    相关资源
    最近更新 更多