【问题标题】:ERR_EMPTY_RESPONSE error when the server takes more than 2min to respond服务器响应时间超过 2 分钟时出现 ERR_EMPTY_RESPONSE 错误
【发布时间】:2020-09-14 15:12:52
【问题描述】:

我使用 nodeexpress 编写了一个 Web 服务,它可以根据请求运行自动化并以最终报告进行响应。

我在客户端使用 jquery ajax(也尝试过 fetch API)在服务器中启动自动化,完成后,报告被压缩为 zip 并发送到客户端。

问题:

当服务器在 2 分钟内响应时,zip 下载成功,但当服务器响应时间超过 2 分钟时,http 请求失败,并显示“ERR_EMPTY_RESPONSE”,但服务器端没有问题。
我了解到默认情况下 HTTP 请求没有超时,但我不确定我为什么会遇到这个问题。

我想知道这种行为背后的原因。

在客户端发出的ajax 请求的片段:

                var promise = $.ajax({
                    url: 'http://localhost:8001/test',
                    method:'POST',
                    xhrFields: {
                        responseType: 'blob'
                    },
                    success: function(res){
                        downloadFromBlob(res);
                    },
                    error: function(xhr, statusText, err){
                        alert(statusText);
                    },
                    data: options,
                });

来自网络服务的片段(我刚刚尝试在此处重现该问题。自动化需要近 15 分钟才能完成):

  router.get('/test/', runAutomation);
  async function runAutomation(req, res, next){
        res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
        res.header('Access-Control-Allow-Origin', '*');
        res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
        const timeout = 120000;
        setTimeout(()=> {
            const path = 'reports.zip';
            res.download(path);
        }, timeout);
    },  

【问题讨论】:

    标签: node.js express http


    【解决方案1】:

    这不是由后端引起的,而是由您的浏览器引起的 - 我一直在某个时候看到所有浏览器的 2 分钟超时。您可能希望您的后端立即返回 202 Accepted,然后 ping 它以获取更新,而不是试图等待它一次性完成。

    【讨论】:

    • 但我见过一些网站,请求需要大约 10 分钟才能响应,但它仍然没有失败,并且完成时没有任何错误。怎么可能? @josh.trow
    • 发送完整响应可能需要 10 分钟,但在此之前它可能会发回一些位,让浏览器等待并重新启动 2 分钟超时?
    • 没有 @josh.trow 。我发现问题出在节点服务器上。设置 server.setTimeout(0) 解决了这个问题。谢谢!你可以参考这里-nodejs.org/api/http.html#http_server_settimeout_msecs_callback。默认情况下。节点服务器超时为 2 分钟。
    【解决方案2】:

    在 express 中,如果我们检查 /bin/www 文件内容,默认情况下它将超时设置为 120000 毫秒,如下所示

     server.setTimeout(120000);
    

    我们需要更新它。 参考:https://nodejs.org/api/http.html#http_server_settimeout_msecs_callback

    【讨论】:

      猜你喜欢
      • 2018-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-07
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多