Nodejs socket hang up 问题
Nodejs socket hang up 问题
写了一段用代理请求的代码,可是总会出现socket hang up的问题,我觉得是没有关闭request,但是加了req.end()之后,又会出现下面的错误。 req.abort(); ^ TypeError: Object false has no method 'abort’ at null._onTimeout (/home/ilolita/node_model/spider/crawler/test/timeOutTest.js:6:9) at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
请问大神们这个问题怎么解决??
var http = require(‘http’);
var request_timer = null, req = null; // 请求5秒超时 request_timer = setTimeout(function() { req.abort(); console.log(‘Request Timeout.’); }, 5000);
var options = { host: ‘180.118.105.153’, port: ‘18186’, path: ‘http://www.cnodejs.org/’ };
req = http.get(options, function(res) { clearTimeout(request_timer);
// 等待响应60秒超时
var response_timer = setTimeout(function() {
res.destroy();
console.log('Response Timeout.');
}, 60000);
console.log("Got response: " + res.statusCode);
var chunks = [], length = 0;
res.on(‘data’, function(chunk) {
length += chunk.length;
chunks.push(chunk);
});
res.on(‘end’, function() {
clearTimeout(response_timer);
console.log(res.headers);
});
}).on(‘error’,function(err){ console.log('Error: '+ err ); });
Nodejs socket hang up 问题
你遇到的 socket hang up
错误通常是因为网络连接被意外中断或服务器端提前关闭了连接。同时,你在处理超时时出现的 TypeError: Object false has no method 'abort'
错误是因为在某些情况下,req
变量可能没有正确初始化。
下面是一些可能的解决方案以及改进后的代码:
解决方案
- 确保
req
正确初始化:在使用req
之前,确保它已经被正确地初始化。 - 使用
req.destroy()
而不是req.abort()
:req.abort()
方法在某些情况下可能会返回false
,导致错误。 - 正确处理错误和超时:确保在请求过程中正确处理错误和超时。
示例代码
var http = require('http');
var request_timer = null, req = null;
// 请求5秒超时
request_timer = setTimeout(function() {
if (req) {
req.destroy();
}
console.log('Request Timeout.');
}, 5000);
var options = {
host: '180.118.105.153',
port: 18186,
path: 'http://www.cnodejs.org/'
};
req = http.get(options, function(res) {
clearTimeout(request_timer);
// 等待响应60秒超时
var response_timer = setTimeout(function() {
res.destroy();
console.log('Response Timeout.');
}, 60000);
console.log("Got response: " + res.statusCode);
var chunks = [], length = 0;
res.on('data', function(chunk) {
length += chunk.length;
chunks.push(chunk);
});
res.on('end', function() {
clearTimeout(response_timer);
console.log(res.headers);
});
}).on('error', function(err) {
console.log('Error: ' + err.message);
});
解释
-
初始化
req
:- 在
http.get
调用后立即初始化req
,确保它是一个有效的请求对象。
- 在
-
使用
req.destroy()
:req.destroy()
是一个更安全的方法来关闭请求,因为它不会引发错误。
-
错误和超时处理:
- 使用
clearTimeout
来清除定时器,避免多次触发超时事件。 - 在
req.on('error')
中捕获任何错误并进行处理。
- 使用
通过这些调整,你可以更好地管理请求和响应的超时情况,并减少 socket hang up
和其他错误的发生。
req没定义,所以报“TypeError: Object false has no method ‘abort’”。setTimeout可以直接用http.setTimeout,req.setTimeout,res.setTimeout提供的函数。不妨参考一下我写的: https://github.com/xuduo35/simpleproxy/blob/master/testproxy.js
同意 1L 的意见。超时应该用 http 自带的 setTimeout 来做。
嗯,好的,谢谢~我参考下
确认连接是否关闭应该看fd还有netsh,否则这样的尝试只是解决了问题而没有了解问题 :)
根据你的描述,出现 socket hang up
错误通常是由于网络连接问题或者请求被服务器提前终止。而在你的代码中,req.abort()
被尝试调用在一个已经被设置为 false
的对象上,这会导致 TypeError
。
解决方案
- 正确处理请求对象:确保
req
是一个有效的 HTTP 请求对象,而不是false
或其他无效值。 - 正确使用超时逻辑:你需要正确地管理请求和响应的超时。
示例代码
var http = require('http');
var request_timer = null;
var options = {
host: '180.118.105.153',
port: '18186',
path: '/api/path' // 假设这是你要请求的实际路径
};
var req = http.get(options, function(res) {
clearTimeout(request_timer);
console.log("Got response: " + res.statusCode);
var chunks = [], length = 0;
res.on('data', function(chunk) {
length += chunk.length;
chunks.push(chunk);
});
res.on('end', function() {
console.log(res.headers);
});
}).on('error', function(err) {
console.log('Error: ' + err.message);
});
// 请求5秒超时
request_timer = setTimeout(function() {
if (req) {
req.abort();
}
console.log('Request Timeout.');
}, 5000);
// 响应60秒超时
req.setTimeout(60000, function() {
req.abort();
console.log('Response Timeout.');
});
关键点解释
req.abort()
:需要确保req
对象存在,否则会导致TypeError
。通过检查if (req)
来避免这种情况。- 超时管理:使用
setTimeout
和req.setTimeout
分别管理请求和响应的超时。 - 错误处理:在请求过程中捕获错误并打印出来。
这样可以避免 socket hang up
和 TypeError
的问题。希望这能解决你的问题。