gpt4 book ai didi

node.js - NodeJS - "socket hang up"实际上是什么意思?

转载 作者:IT老高 更新时间:2023-10-28 21:45:22 27 4
gpt4 key购买 nike

我正在使用 Node 和 Cheerio 构建一个网络抓取工具,对于某个网站,我收到以下错误(它只发生在这个网站上,没有其他我尝试抓取的网站。

它每次都发生在不同的位置,所以有时是 url x 抛出错误,其他时候 url x 很好,它完全是一个不同的 url:

    Error!: Error: socket hang up using [insert random URL, it's different every time]

Error: socket hang up
at createHangUpError (http.js:1445:15)
at Socket.socketOnEnd [as onend] (http.js:1541:23)
at Socket.g (events.js:175:14)
at Socket.EventEmitter.emit (events.js:117:20)
at _stream_readable.js:910:16
at process._tickCallback (node.js:415:13)

调试起来非常棘手,我真的不知道从哪里开始。首先,IS 是什么套接字挂起错误?是 404 错误还是类似的错误?还是仅仅意味着服务器拒绝连接?

我在任何地方都找不到对此的解释!

编辑:这是(有时)返回错误的代码示例:

function scrapeNexts(url, oncomplete) {
request(url, function(err, resp, body) {

if (err) {
console.log("Uh-oh, ScrapeNexts Error!: " + err + " using " + url);
errors.nexts.push(url);
}
$ = cheerio.load(body);
// do stuff with the '$' cheerio content here
});
}

没有直接调用来关闭连接,但我正在使用 Node Request其中(据我所知)使用 http.get 所以这不是必需的,如果我错了,请纠正我!

编辑 2:这是一个实际的、正在使用的代码,它会导致错误。 prodURL 和其他变量大多是前面定义的 jquery 选择器。这使用 async Node 的库。

function scrapeNexts(url, oncomplete) {
request(url, function (err, resp, body) {

if (err) {
console.log("Uh-oh, ScrapeNexts Error!: " + err + " using " + url);
errors.nexts.push(url);
}
async.series([
function (callback) {
$ = cheerio.load(body);
callback();
},
function (callback) {
$(prodURL).each(function () {
var theHref = $(this).attr('href');
urls.push(baseURL + theHref);
});
var next = $(next_select).first().attr('href');
oncomplete(next);
}
]);
});
}

最佳答案

socket hang up被抛出有两种情况:

当您是客户时

当您作为客户端向远程服务器发送请求时,没有及时收到响应。您的套接字已结束,这会引发此错误。您应该捕捉到这个错误并决定如何处理它:是否重试请求、将其排队等待以后等等。

当您是服务器/代理时

当您作为服务器(可能是代理服务器)收到来自客户端的请求,然后开始对其采取行动(或将请求中继到上游服务器),在您准备好响应之前,客户端决定取消/中止请求。

此堆栈跟踪显示客户端取消请求时发生的情况。

Trace: { [Error: socket hang up] code: 'ECONNRESET' }
at ClientRequest.proxyError (your_server_code_error_handler.js:137:15)
at ClientRequest.emit (events.js:117:20)
at Socket.socketCloseListener (http.js:1526:9)
at Socket.emit (events.js:95:17)
at TCP.close (net.js:465:12)

http.js:1526:9行指向@Blender 提到的同一个socketCloseListener,特别是:

// This socket error fired before we started to
// receive a response. The error needs to
// fire on the request.
req.emit('error', createHangUpError());

...

function createHangUpError() {
var error = new Error('socket hang up');
error.code = 'ECONNRESET';
return error;
}

如果客户端是浏览器中的用户,这是一个典型的情况。加载某些资源/页面的请求需要很长时间,用户只需刷新页面即可。此类操作会导致先前的请求中止,这会在您的服务器端引发此错误。

由于此错误是由客户的意愿引起的,因此他们不希望收到任何错误消息。因此,无需将此错误视为严重错误。忽略它。令人鼓舞的是,在发生此类错误时,您的客户端监听的 res 套接字虽然仍可写,但已被破坏。

console.log(res.socket.destroyed); //true

所以,没有必要发送任何东西,除了显式关闭响应对象:

res.end();

但是,如果您已经将请求中继到上游的代理服务器,那么您应该确定的是,中止您对上游的内部请求,表明你对响应不感兴趣,这反过来会告诉上游服务器,也许,停止一个昂贵的操作。

关于node.js - NodeJS - "socket hang up"实际上是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16995184/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com