【发布时间】:2014-07-18 11:35:56
【问题描述】:
我正在使用 Node/express 服务器。 express 的默认超时时间是 120,000 毫秒,但对我来说还不够。当我的响应达到 120,000 毫秒时,控制台会记录 POST /additem 200 120006ms 并且页面显示错误,所以我想将超时设置为更大的值。我该怎么做?
【问题讨论】:
标签: node.js express request timeout
我正在使用 Node/express 服务器。 express 的默认超时时间是 120,000 毫秒,但对我来说还不够。当我的响应达到 120,000 毫秒时,控制台会记录 POST /additem 200 120006ms 并且页面显示错误,所以我想将超时设置为更大的值。我该怎么做?
【问题讨论】:
标签: node.js express request timeout
Linking to express issue #3330
您可以为整个服务器全局设置超时:
var server = app.listen();
server.setTimeout(500000);
或仅针对特定路线:
app.post('/xxx', function (req, res) {
req.setTimeout(500000);
});
【讨论】:
使用最新的 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);
};
【讨论】:
在bin/www有配置的,只需在http服务器创建后加上timeout参数即可。
var server = http.createServer(app);
/**
* Listen on provided port, on all network interfaces
*/
server.listen(port);
server.timeout=yourValueInMillisecond
【讨论】:
对于特定请求,可以将 timeOut 设置为 0,这在我们从数据库或其他服务器获得回复之前不会超时
request.setTimeout(0)
【讨论】:
试试这个:
var options = {
url: 'http://url',
timeout: 120000
}
request(options, function(err, resp, body) {});
有关其他选项,请参阅 request 的文档。
【讨论】:
POST /additem 200 120006ms,页面显示错误。
require('request') 和require('express')。在这种情况下,当您通过request 模块创建数据时,它只会在请求完成后执行您的回调。通过按照@Lee 的建议指定timeout,您将“失败”请求并在返回数据之前调用回调。对我来说,这通常比通过 express 失败要好,正如@SomeKittens 所建议的那样,因为我经常需要在退出流程之前清理我的请求。我建议使用 2000(2 秒)而不是 120000(2 分钟)
我假设您使用的是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/');
【讨论】: