2017-06-20 79 views
-1
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来提出我的要求。在ExpressJS上尽早结束的请求

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

卷曲等待了几分钟的回应,然后我得到空回复错误。 cURL在 nodejs打印回调触发消息之前给出此错误

如果我用浏览器或邮递员发出此请求,则会出现同样的错误。

我敢肯定,res.end()函数里面没有job()异步函数。我卡住了,我如何跟踪并发现错误?

回答

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服务器对象(不属于快速app对象)。

+0

你猜我的问题是http服务器的默认超时设置。所以我把这个值从2分钟增加到5分钟,我的问题就解决了。谢谢。 – Eray