我尝试在一个使用http.request的超时客户端上设置一个超时。到目前为止,我所做的是:
var options = { ... }
var req = http.request(options, function(res) {
// Usual stuff: on(data), on(end), chunks, etc...
}
/* This does not work TOO MUCH... sometimes the socket is not ready (undefined) expecially on rapid sequences of requests */
req.socket.setTimeout(myTimeout);
req.socket.on('timeout', function() {
req.abort();
});
req.write('something');
req.end();
有什么提示吗?
发布于 2019-03-06 18:47:02
只是为了澄清一下answer above
现在可以使用timeout
选项和相应的请求事件:
// set the desired timeout in options
const options = {
//...
timeout: 3000,
};
// create a request
const request = http.request(options, response => {
// your callback here
});
// use its "timeout" event to abort the request
request.on('timeout', () => {
request.abort();
});
发布于 2012-03-28 23:07:14
2019更新
现在有各种方法可以更优雅地处理这个问题。请在这个帖子上看到一些其他的答案。技术发展很快,所以答案往往很快就会过时。我的答案仍然有效,但也值得考虑其他选择。
2012年答案
使用您的代码,问题是在尝试设置套接字对象之前,您没有等待将套接字分配给请求。这一切都是异步的,所以:
var options = { ... }
var req = http.request(options, function(res) {
// Usual stuff: on(data), on(end), chunks, etc...
});
req.on('socket', function (socket) {
socket.setTimeout(myTimeout);
socket.on('timeout', function() {
req.abort();
});
});
req.on('error', function(err) {
if (err.code === "ECONNRESET") {
console.log("Timeout occurs");
//specific error treatment
}
//other error treatment
});
req.write('something');
req.end();
当为请求分配套接字对象时,将触发“socket”事件。
发布于 2012-06-27 15:29:04
此时,有一个方法可以直接在请求对象上执行此操作:
request.setTimeout(timeout, function() {
request.abort();
});
这是一个快捷方法,它绑定到套接字事件,然后创建超时。
https://stackoverflow.com/questions/6214902
复制相似问题