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 ); });


6 回复

Nodejs socket hang up 问题

你遇到的 socket hang up 错误通常是因为网络连接被意外中断或服务器端提前关闭了连接。同时,你在处理超时时出现的 TypeError: Object false has no method 'abort' 错误是因为在某些情况下,req 变量可能没有正确初始化。

下面是一些可能的解决方案以及改进后的代码:

解决方案

  1. 确保 req 正确初始化:在使用 req 之前,确保它已经被正确地初始化。
  2. 使用 req.destroy() 而不是 req.abort()req.abort() 方法在某些情况下可能会返回 false,导致错误。
  3. 正确处理错误和超时:确保在请求过程中正确处理错误和超时。

示例代码

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);
});

解释

  1. 初始化 req

    • http.get 调用后立即初始化 req,确保它是一个有效的请求对象。
  2. 使用 req.destroy()

    • req.destroy() 是一个更安全的方法来关闭请求,因为它不会引发错误。
  3. 错误和超时处理

    • 使用 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

解决方案

  1. 正确处理请求对象:确保 req 是一个有效的 HTTP 请求对象,而不是 false 或其他无效值。
  2. 正确使用超时逻辑:你需要正确地管理请求和响应的超时。

示例代码

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) 来避免这种情况。
  • 超时管理:使用 setTimeoutreq.setTimeout 分别管理请求和响应的超时。
  • 错误处理:在请求过程中捕获错误并打印出来。

这样可以避免 socket hang upTypeError 的问题。希望这能解决你的问题。

回到顶部