NodeJS - “套接字挂起”实际上是什么意思?

2024-07-03

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

它每次都发生在不同的地点,所以有时url x会引发错误,其他时候url x很好,它是一个完全不同的网址:

    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 https://github.com/mikeal/request(据我所知)使用http.get所以这不是必需的,如果我错了,请纠正我!

编辑2:这是一个实际的、正在使用的代码,它会导致错误。prodURL其他变量大多是前面定义的jquery选择器。这使用了async https://github.com/caolan/async#seriesNode 的库。

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)

Line http.js:1526:9指向相同的socketCloseListener@Blender 提到,特别是:

// 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();

然而,你什么应该做肯定如果你are已经将请求中继到上游的代理服务器将中止对上游的内部请求,表明您对响应缺乏兴趣,这反过来会告诉上游服务器也许停止昂贵的操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NodeJS - “套接字挂起”实际上是什么意思? 的相关文章

  • socket.io 在连接时发出

    刚接触 socket io 并进行试验 这个应用程序非常简单 当我单击显示按钮时 屏幕上会实时出现图像 我有 2 个问题 我的主要问题 添加后 图像在所有客户端上都显示良好 我现在的目标是让所有连接的新客户端都能看到相同的数据 例如 如果我
  • 确定方法是同步还是异步

    在node js中 是否可以 使用函数 确定方法是同步还是异步 我想编写一个执行以下操作的函数 function isSynchonous methodName if the method is synchronous return tru
  • 通过 http 在两个 Node.js 服务器之间传输文件

    我有两个通过 http 相互通信的 node js express 服务器 server A它还与浏览器通信并可以处理文件上传请求 当文件上传到server A我想将其原样转移到server B以便进一步加工 最好的方法是什么 最好与请求
  • node-http-proxy,如何将新的查询参数传递给初始请求?

    我正在尝试将新的查询参数添加到我的原始请求中节点 http 代理 https github com http party node http proxy 调整req query直接这样不行 app all path function req
  • React-Native 停留在加载依赖图已完成。没有错误

    我的应用程序有问题 运行react native run android后 进程因空白页面应用程序而停止 并卡在加载依赖关系图完成时 没有任何反应 一切都很好 突然就不再工作了 我尝试了在互联网上找到的所有内容 仍然不起作用 有任何想法吗
  • NodeJS Web 应用程序文件上传会删除文件开头

    我正在做一个 NodeJS 项目 涉及文件上传 上传是在客户端完成的 代码如下 file upload bind change focus click function var file jQuery this 0 files 0 if f
  • 强制从私有注册表下载 npm

    在我的 Nodejs 项目中 我必须修改 4 个节点模块并将它们上传到我们的私人公司注册表 以便该项目将在构建期间下载修改后的版本 我通过改变来做到这一点resolved领域在package lock json对于我们的虚拟 npm 注册表
  • 让应用程序在启动时运行

    我正在制作一个 mac 应用程序原子壳层 https github com atom atom shell位于菜单栏中 我想知道我的选择是什么让它在启动时运行 是否必须由用户手动完成 我需要获得用户的许可才能执行此操作吗 我将如何使用 No
  • 将猫鼬承诺与 async/await 结合使用

    我试图掌握使用 Mongoose Promise 和 Node js 的 async await 功能的窍门 当我的函数printEmployees称为我想保存查询的员工列表orderEmployees功能 同时 console log里面
  • 如何使用node.js连接到ElastiCache集群

    我们知道不建议在 Amazon 实例外部访问 ElastiCache https stackoverflow com a 21937214 2404470 因此我们仅在 Amazon EC2 实例中尝试以下内容 我们有一个ElastiCac
  • 如何使用node.js连接到ElastiCache集群

    我们知道不建议在 Amazon 实例外部访问 ElastiCache https stackoverflow com a 21937214 2404470 因此我们仅在 Amazon EC2 实例中尝试以下内容 我们有一个ElastiCac
  • 使用 Gmail API Node.js 客户端发送大附件 (> 5 MB)

    当我使用 Gmail API Node js 客户端发送附件大于 5 MB 的电子邮件时 出现错误 413 请求实体太大 我首先创建一个字符串 mimeMessage 其中包含 multipart mixed 类型的 MIME 消息 此消息
  • 使用 Gmail API Node.js 客户端发送大附件 (> 5 MB)

    当我使用 Gmail API Node js 客户端发送附件大于 5 MB 的电子邮件时 出现错误 413 请求实体太大 我首先创建一个字符串 mimeMessage 其中包含 multipart mixed 类型的 MIME 消息 此消息
  • 为什么我会收到“Promise is not Defined”。节点 v5.7.0 上出现错误

    我在用着自动前缀器 https www npmjs com package autoprefixer with postcss https github com postcss postcss在转移到新的 Linux 服务器后 肯定出了什么
  • 将 JSON 传递给 HTTP POST 请求

    我正在尝试使用以下命令向 google QPX Express API 1 发出 HTTP POST 请求nodejs and request 2 我的代码如下所示 create http request client to consume
  • 使用护照和快递进行基本身份验证

    我一定错过了一些东西 但是根据我找到的所有教程 这就是您使用节点应用程序进行基本身份验证的方式express and passport passport local 我知道这不符合最佳实践 我只是想让 POC 运行起来 use strict
  • Mongoose 查询:查找数组中的元素

    Mongoose Mongo noob在这里 My Data 这是我的简化数据 每个用户都有自己的文档 v 1 id ObjectId 53440e94c02b3cae81eb0065 email email protected cdn c
  • Node.JS 执行 git 命令错误:权限被拒绝(公钥)

    问 我怎样才能跑步git push from node js with passphrase 我正在尝试构建一个需要运行的小模块git push from node js到远程repo 但是当我使用 from 时出现错误node js ex
  • Eslint:无重复解决错误:无法加载解析器“节点”

    我今天刚刚更新了我的项目 带有 VueJS 和 Quasar Framework 的 SPA npm update我现在无法运行它 我收到错误no duplicates Resolve error unable to load resolv
  • nodejs npm 安装socket.io 错误

    我是新的 Node js 开发人员 我尝试简单的聊天项目 所以我想使用 NPM 安装 socket io 但出现此错误 我用的是ubuntu 12 04 ubuntu Ubuntu 1210 Masa st blog npm install

随机推荐

  • matlab/八度随机事件ode45

    我在理解如何在 Octave Matlab 中实现事件以及微分方程的求解方面遇到了一些困难 例如 考虑这个简单的代码来求解微分方程 y y function dy odefun t y dy y endfunction options od
  • 在 redshift 上查询数据时出错 - 获取条带数据时出错

    我正在尝试在 redshift 中的外部表上运行以下查询 select from schema table limit 10 我收到一个错误 2018 06 20 12 03 14 XX000 500310 Amazon 无效操作 S3 查
  • matlab/八度随机事件ode45

    我在理解如何在 Octave Matlab 中实现事件以及微分方程的求解方面遇到了一些困难 例如 考虑这个简单的代码来求解微分方程 y y function dy odefun t y dy y endfunction options od
  • 有没有办法先在主窗口上搜索 webelement,如果找不到,然后开始在 iframe 内搜索?

    要求 默认情况下 在主窗口上搜索 webelement 如果找到则执行操作 否则在 iframe 内搜索 webelement 并执行所需的操作 硒 3 141 WebElement el driver findElement By xpa
  • 有没有办法先在主窗口上搜索 webelement,如果找不到,然后开始在 iframe 内搜索?

    要求 默认情况下 在主窗口上搜索 webelement 如果找到则执行操作 否则在 iframe 内搜索 webelement 并执行所需的操作 硒 3 141 WebElement el driver findElement By xpa
  • 更改 SQL Server 中的列

    什么是正确的语法ALTER语句向现有列添加默认值 我可以毫无错误地添加新列 ALTER TABLE tb TableName ADD Record Status varchar 20 但是如果我尝试使用以下语句更改现有列以应用默认值 ALT
  • 更改 SQL Server 中的列

    什么是正确的语法ALTER语句向现有列添加默认值 我可以毫无错误地添加新列 ALTER TABLE tb TableName ADD Record Status varchar 20 但是如果我尝试使用以下语句更改现有列以应用默认值 ALT
  • 使用 Java 的默认包是一种不好的做法吗?

    使用 Java 的默认包是一种不好的做法吗 是的 理想情况下 包名称应该是全局唯一的 以避免命名冲突 使用默认包打破了这一约定 也不可能从默认包中导入类 如果未命名的包是一个坏主意 为什么还要存在呢 从JLS 7 4 2 http java
  • Kafka:偏移序列

    每条发布的消息 假设消息被压缩 是否都会分配一个唯一的偏移量 并在给定分区内保持顺序和增量 另外 offset 序列是否可以重置自身 这意味着它可以从0开始 官方文档 https kafka apache org documentation
  • Postgres 中的动态 UNION ALL 查询

    我们使用 Postgres PostGis 连接来获取通过地理服务器发布的数据 查询现在看起来像这样 SELECT row number over ORDER BY a ogc fid AS qid a wkb geometry AS ge
  • Postgres 中的动态 UNION ALL 查询

    我们使用 Postgres PostGis 连接来获取通过地理服务器发布的数据 查询现在看起来像这样 SELECT row number over ORDER BY a ogc fid AS qid a wkb geometry AS ge
  • 如何在 c# 中包含 AutomationElement?我需要补充什么?

    我无法初始化 AutomationElement AutomationElement element AutomationElement FromHandle process MainWindowHandle 它突出显示 Automatio
  • 能够使用 MS bot 框架接收文件

    我可能有点早了 但是是否也可以使用新的 Microsoft Bot Framework 接收文件 主要通过 Skype 我在文档中找不到任何内容 I found IList
  • 能够使用 MS bot 框架接收文件

    我可能有点早了 但是是否也可以使用新的 Microsoft Bot Framework 接收文件 主要通过 Skype 我在文档中找不到任何内容 I found IList
  • 上下文 sp_OAMethod“发送”中的 msxml3.dll

    Win2003 SQL Server 2005 中的工作代码在 Win2012 SQL Server 2012 sp1 下无法工作 唯一 真实solution https social msdn microsoft com 443 Foru
  • 如何从 Dart 中的字符串中删除换行符?

    如何从 Dart 中的字符串中删除换行符 例如 我想转换 hello nworld to hello world 您可以使用replaceAll 模式 替换 main var multiline hello nworld var singl
  • 如何在 setup.py 中引导 numpy 安装

    我有一个项目 它有一个 C 扩展 需要 numpy 理想情况下 我希望下载我的项目的人都能够运行python setup py install或使用一个电话pip 我遇到的问题是在我的setup py我需要导入 numpy 来获取标题的位置
  • 如何从 Dart 中的字符串中删除换行符?

    如何从 Dart 中的字符串中删除换行符 例如 我想转换 hello nworld to hello world 您可以使用replaceAll 模式 替换 main var multiline hello nworld var singl
  • 循环setInterval函数

    我不确定为什么间隔不循环 我完全按照教程进行操作 但运气不佳 建议 document ready function setInterval function current removeClass current next addClass
  • NodeJS - “套接字挂起”实际上是什么意思?

    我正在使用 Node 和 Cheerio 构建一个网络抓取工具 对于某个网站 我收到以下错误 它只发生在这个网站上 我尝试抓取的其他网站上没有发生这种情况 它每次都发生在不同的地点 所以有时url x会引发错误 其他时候url x很好 它是