如何修改nodejs请求默认超时时间?

Posted

技术标签:

【中文标题】如何修改nodejs请求默认超时时间?【英文标题】:How to modify the nodejs request default timeout time? 【发布时间】:2014-07-18 11:35:56 【问题描述】:

我正在使用 Node/express 服务器。 express 的默认超时时间是 120,000 毫秒,但对我来说还不够。当我的响应达到 120,000 毫秒时,控制台会记录 POST /additem 200 120006ms 并且页面显示错误,所以我想将超时设置为更大的值。我该怎么做?

【问题讨论】:

【参考方案1】:

Linking to express issue #3330

您可以为整个服务器全局设置超时:

var server = app.listen();
server.setTimeout(500000);

或仅针对特定路线:

app.post('/xxx', function (req, res) 
   req.setTimeout(500000);
);

【讨论】:

我只是想自己添加这个答案。正在寻找这个,但没有看到你的答案。【参考方案2】:

使用最新的 NodeJS,您可以试用这个猴子补丁:

const http = require("http");
const originalOnSocket = http.ClientRequest.prototype.onSocket;
require("http").ClientRequest.prototype.onSocket = function(socket) 
    const that = this;
    socket.setTimeout(this.timeout ? this.timeout : 3000);
    socket.on('timeout', function() 
        that.abort();
    );
    originalOnSocket.call(this, socket);
;

【讨论】:

【参考方案3】:

bin/www有配置的,只需在http服务器创建后加上timeout参数即可。

var server = http.createServer(app);
/**
* Listen on provided port, on all network interfaces
*/
server.listen(port);
server.timeout=yourValueInMillisecond

【讨论】:

嗨罗希斯。这在本地机器上工作得很好,但在部署时不起作用。知道为什么吗? 你是如何在部署中运行它的?是永远使用 PM2 吗? bin/www 是在部署时用于 HTTP 服务器配置还是来自任何其他来源?。【参考方案4】:

对于特定请求,可以将 timeOut 设置为 0,这在我们从数据库或其他服务器获得回复之前不会超时

request.setTimeout(0)

【讨论】:

我的测试表明这可以工作,但我找不到任何文档?【参考方案5】:

试试这个:

var options = 
    url:  'http://url',
    timeout: 120000


request(options, function(err, resp, body) );

有关其他选项,请参阅 request 的文档。

【讨论】:

这个我试过了,但是不行。当响应达到120000毫秒时,控制台仍然显示POST /additem 200 120006ms,页面显示错误。 会不会是服务器端超时设置? 我们应该真正区分incoming http请求和outgoing http请求。 如果您使用节点应用程序作为代理,您可能需要同时使用require('request')require('express')。在这种情况下,当您通过request 模块创建数据时,它只会在请求完成后执行您的回调。通过按照@Lee 的建议指定timeout,您将“失败”请求并在返回数据之前调用回调。对我来说,这通常比通过 express 失败要好,正如@SomeKittens 所建议的那样,因为我经常需要在退出流程之前清理我的请求。我建议使用 2000(2 秒)而不是 120000(2 分钟) 超时这是一个有效的参数github.com/request/request#user-content-requestoptions-callback【参考方案6】:

我假设您使用的是express,鉴于您在问题中的日志。关键是在服务器上设置timeout 属性(下面将超时设置为一秒,使用你想要的任何值):

var server = app.listen(app.get('port'), function() 
  debug('Express server listening on port ' + server.address().port);
);
server.timeout = 1000;

如果您不使用 express 并且仅使用 vanilla 节点,则原理是相同的。以下不会返回数据:

var http = require('http');
var server = http.createServer(function (req, res) 
  setTimeout(function() 
    res.writeHead(200, 'Content-Type': 'text/plain');
    res.end('Hello World\n');
  , 200);
).listen(1337, '127.0.0.1');

server.timeout = 20;
console.log('Server running at http://127.0.0.1:1337/');

【讨论】:

你知道超时功能多久运行一次吗?就像每一秒?每 500 毫秒? 这是在哪里记录的?

以上是关于如何修改nodejs请求默认超时时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何编辑 Google Cloud 任务的默认超时(使用 http 目标,而不是应用引擎)?

更改解析请求的超时

aws beanstalk nodejs:如何覆盖 nginx 的 60 秒超时

如何解决SSH连接Linux超时自动断开

AngularJS $http 服务请求的默认超时是多少?

限定页面执行时间,请求超时抛出异常或提示