【问题标题】:Request ending early on ExpressJS请求在 ExpressJS 上提前结束
【发布时间】:2017-06-20 02:15:50
【问题描述】:
router.route('...')
.get(function(req, res, next) {
  // This job() function doing some *long* async task and end of the task calling 3th param as callback     
  job(param1, param2, function(response) {
    // printing response to console perfectly
    console.log("callback fired", response);
    res.send("response");
  }); 
});

我正在向curl 提出我的请求。

$ curl ... -m 300
curl: (52) Empty reply from server

cURL 等待响应几分钟,然后我收到 empty reply 错误。 cURL 在 before nodejs 打印 回调触发 消息时给出此错误。

如果我使用浏览器或 Postman 发出此请求,也会出现同样的错误。

我确定 job() 异步函数中没有 res.send()res.end() 函数。我卡住了,如何跟踪并找到错误?

【问题讨论】:

    标签: node.js express curl


    【解决方案1】:

    有两种可能的超时可能会影响您。如果没有看到实际的网络跟踪(查看请求结束时会发生什么),我无法判断哪个超时可能导致您的问题。但是,您可以同时解决这两个问题,它应该可以解决您的问题。

    首先,curl 有一个超时值。目前还不清楚它的默认设置是什么,但你可以设置任何你想要的值:

    curl --max-time 900
    

    值以秒为单位。

    其次,nodejs http 服务器有一个超时,如果没有对打开请求发送响应,它将关闭套接字(这可以防止死套接字随着时间的推移而建立)。您可以查看server.setTimeout() here 的文档。 http 服务器对象的默认值为 2 分钟(我不知道 Express 是否会改变它)。

    大致思路是这样的:

     server.setTimeout(10 * 60 * 1000);   // set response timeout to 10 minutes
    

    server 对象将是您的 http 服务器对象(而不是 Express app 对象)。

    【讨论】:

    • 你猜我的问题是http服务器的默认超时设置。所以我将该值从 2 分钟增加到 5 分钟,我的问题就解决了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 2019-11-14
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    相关资源
    最近更新 更多