node.js http.get 在对远程站点发出 5 次请求后挂起

2024-01-12

我正在编写一个简单的 api 端点来确定我的服务器是否能够访问互联网。它工作得很好,但是在 5 个请求之后(每次都是 5 个)请求就会挂起。当我将 Google 切换到 Hotmail.com 时,也会发生同样的情况,这让我觉得这是我的事情。我需要关闭 http.get 请求吗?我的印象是这个函数会自动关闭请求。

// probably a poor assumption, but if Google is unreachable its generally safe to say     that the server can't access the internet
// using this client side in the dashboard to enable/disable internet resources

app.get('/api/internetcheck', function(req, res) {
console.log("trying google...");
    http.get("http://www.google.com", function(r){
        console.log("Got status code!: " +r.statusCode.toString());
        res.send(r.statusCode.toString());
        res.end();
        console.log("ended!"); 
    }).on('error', function(e) {
        console.log("Got error: " + e.message);
    });
});

原因如下“正好5”: https://nodejs.org/docs/v0.10.36/api/http.html#http_agent_maxsockets https://nodejs.org/docs/v0.10.36/api/http.html#http_agent_maxsockets

在内部,http模块使用代理类来管理 HTTP 请求。默认情况下,该代理最多允许与同一 HTTP 服务器建立 5 个打开连接。

在您的代码中,您不会使用 Google 发送的实际响应。因此,代理假定您尚未完成请求,并将保持连接打开。因此,在 5 个请求之后,代理将不再允许您创建新连接,并将开始等待任何现有连接完成。

显而易见的解决方案是只使用数据:

http.get("http://www.google.com", function(r){
  r.on('data', function() { /* do nothing */ });
  ...
});

如果您遇到了您的问题/api/internetcheck路由被调用很多,所以你需要允许超过5个并发连接,你可以增加连接池大小,或者完全禁用代理(尽管在这两种情况下你仍然需要消耗数据);

// increase pool size
http.globalAgent.maxSockets = 100;

// disable agent
http.get({ hostname : 'www.google.com', path : '/', agent : false }, ...)

或者也许使用HEAD请求而不是GET.

(PS:万一http.get生成错误,您仍然应该使用以下方式结束 HTTP 响应res.end()或类似的东西)。

NOTE:在 Node.js 版本 >= 0.11 中,maxSockets被设定为Infinity https://nodejs.org/api/http.html#http_agent_maxsockets.

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

node.js http.get 在对远程站点发出 5 次请求后挂起 的相关文章

随机推荐

  • 通过转换从 JSON 反序列化为 PHP?

    假设我有一个具有 名称 和 密码 属性的 User 类 以及一个 保存 方法 当通过 json encode 将此类的对象序列化为 JSON 时 该方法被正确跳过 最终得到类似 name testName password testPass
  • switch-case 如何处理“case”中常量的值? [复制]

    这个问题在这里已经有答案了 假设我们有 typedef unsigned char BYTE define CPUTYPE INVALID BYTE 1 switch 语句会命中哪种情况 BYTE m CPUTYPE m CPUTYPE 0
  • Qt .pro 文件:如何检查我是否使用 MSVC 2013 工具集进行编译?

    我已经尝试过这个条件 但它不起作用 如何查看MSVC 2013 win32 msvc2013 QMAKE CXXFLAGS FS 我正在使用 Qt 5 3 Beta 它有msvc 2013 mkspec 抱歉 死亡帖子 但似乎没有可谷歌搜索
  • 将多行合并为一列,不重复

    我正在研究一个将从表中收集数据并显示报告数据的查询 数据如下 Player Score 001 10 001 20 002 20 002 20 001 10 002 10 003 20 002 20 001 10 我希望它像这样显示 Pla
  • 为什么我无法重定向到 grep 用于输入的文件? [复制]

    这个问题在这里已经有答案了 File1 foo bar baz File2 bar patch grep f file1 file2 gt file1 预期结果 file1 包含 bar patch 但它是空的 grep 如何处理输入文件以
  • 如何获取“appname”来构建 t.me URL 以启动 Telegram Web App for Bots

    On the 文档页 https core telegram org bots webapps direct link web apps在 Telegram 的 Web 应用程序中 我们可以读到 直接链接网络应用程序 您可以使用直接链接直接
  • 使用 System.Xml.Serialization.XmlSerializer 反序列化有效 xml 文件时存在差异

    这是一个相当复杂的问题 所以提前致谢 以下两个 xml 文件都针对给定架构进行验证 但在尝试使用 Net 的 XmlSerializer 进行反序列化时 只有第一个文件能够正确执行
  • iOS:如何从数字中获取正确的月份名称?

    我知道 NSDateformatter 功能套件对人类来说是一个福音 但同时它也让我感到非常困惑 我希望你能帮助我 在我的代码中的某个地方 有一个代表月份的 int 所以 1 代表一月 二月 2 日 等等 在我的用户界面中 我想将此整数显示
  • 在 terraform 云中运行的 azure cli $Path 错误

    第一次设置 terraform cloud 并收到此错误 不知道为什么在我的本地计算机上安装了 azure CLI 并设置了路径 但我认为与在 terraform 云平台中设置它有关 Error building AzureRM Clien
  • 在 Doctrine Querybuilder 中使用“DATE()”

    我需要获取所有行DATE a when 匹配字符串2014 09 30 builder this gt em gt createQueryBuilder builder gt select a gt from Entity Appointm
  • 从 C# 应用程序调用 azure powershell cmdlet 失败

    我试图自动化部署到天蓝色云的过程 我的 powershell 脚本可以做到这一点 当从 azure powershell 命令行执行它时 它的工作方式就像一个魅力 当我尝试从 C 应用程序调用相同的脚本时 它失败了 这是我的代码 inter
  • 从命令行使用网络摄像头拍照[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一个 Logitech 网络摄像头 适用于笔记本电脑的 QuickCam Pro 我想从命令行使用该摄像头拍摄快照 它有命令行界面吗 如果没有 是
  • 织物密码

    每次结构运行时 它都会要求输入 root 密码 是否可以将其与自动建议一起发送 fab staging test 我知道您已经询问过密码 但是配置系统以便您可以在没有密码的情况下进行结构 即 SSH 不是更好吗 为此 在本地计算机上执行以下
  • Julia 中向量的就地重排?

    是否可以在给定索引列表的情况下重新排列向量中的值 我有两个数组 我想排序arr2基于arr1两者都是预先分配的 indices zeros length arr1 sortperm indices arr1 arr2 indices lt
  • T4 输出到字符串

    我是 T4 的新手 我想生成 CRUD 存储过程 数据访问层 输出到字符串 我正在尝试创建一种对其他程序员也有用的 Web 服务 api 只需输入数据 然后下载 zip 文件 我已经搜索了很多 但找不到一种生成字符串输出的方法 是否可能 任
  • 在 C++ 中禁用复制省略

    免责声明 研究的目标是如何禁用所提供代码部分的复制省略和返回值优化 如果想提及诸如 XY 问题之类的问题 请避免回答 该问题具有严格的技术和研究性质 并且以这种方式明确提出 C 14 中引入了复制省略和返回值优化 如果某个对象已在一个表达式
  • 跨多个文件的 Javascript 中的全局变量

    我的一堆 JavaScript 代码位于名为 helpers js 的外部文件中 在调用此 JavaScript 代码的 HTML 中 我发现自己需要知道是否调用了 helpers js 中的某个函数 我试图通过定义创建一个全局变量 var
  • Log4J:警告无法为 Logger 错误找到 Appender

    下面是我的log4j properties文件内容 文件与eclipse中的src文件夹放在一起 Application Logs log4j rootlogger INFO logg log4j appender logg org apa
  • Facebook 应用程序是使用 PhoneGap 或 Appcelerator 等移动开发框架构建的吗?

    我发现了numerous http venturebeat com 2011 07 08 hybrid mobile apps take off as html5 vs native debate continues sources htt
  • node.js http.get 在对远程站点发出 5 次请求后挂起

    我正在编写一个简单的 api 端点来确定我的服务器是否能够访问互联网 它工作得很好 但是在 5 个请求之后 每次都是 5 个 请求就会挂起 当我将 Google 切换到 Hotmail com 时 也会发生同样的情况 这让我觉得这是我的事情