当前位置: 首页 > 面试题库 >

5个对远程站点的请求后,node.js http.get挂起

鲁涵映
2023-03-14
问题内容

我正在编写一个简单的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


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

在您的代码中,您不会消耗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产生错误,您仍应使用res.end()或类似方法结束HTTP响应)。

注意 :在Node.js版本> =
0.11中,maxSockets设置为Infinity



 类似资料:
  • 问题内容: 我需要从一个网站向另一个域中托管的REST Web服务发出AJAX请求。 尽管这在Internet Explorer中很好用,但是其他浏览器(例如Mozilla和Google Chrome)强加了更加严格的安全性限制,这些限制禁止跨站点AJAX请求。 问题是我无法控制站点所在的域或Web服务器。这意味着我的REST Web服务必须在其他地方运行,并且我无法采用任何重定向机制。 这是进行

  • 问题内容: 我正在尝试使用“ GWT请求”构建器发出“跨站点请求”,但我无法使其正常工作。如您所见,这是一个GWT示例项目的大部分内容,我已经浏览了https://developers.google.com/web- toolkit/doc/latest/tutorial/Xsite 。但是我仍然缺少一些东西。 我在这里发布代码。我在想什么..? 问题答案: 实际上,如果可以在Servlet Re

  • 如何在JMETER中创建一个测试,该测试将: 总共提出100个请求,但是使 每4次请求站点A和 每5次请求站点B

  • 我已经使用Selenium好几个月了,我们用它来自动化一些内部测试过程。剧本一直很顺利。我最近使用FF 27.01升级到了C#2.40.0 webdriver,我们的脚本现在在随机的地方失败,出现以下错误。 我设法追踪到的最新错误是一行代码: 令人恼火的是,试图解决这个问题被证明是困难的,就像我在本地机器上运行测试一样,调试通过了。此外,如果我在运行测试的构建机器上通过NUNIT runner运行

  • 问题内容: 我需要通过Ajax向远程域发出POST请求,我知道Same-Origin Policy的限制,但我读过,有可能在服务器上的PHP中建立网桥以转发请求。 事实是我不知道如何编写此桥,也无法在Google上找到信息。 我想我需要使用CURL。 有人可以解释一下我怎么写吗? 问题答案: 如果需要代理服务器或“ Bridge ”,则可以尝试以下操作:您可以实现对该PHP脚本的简单AJAX调用,

  • 问题内容: 浏览器不允许跨站点AJAX调用(这是安全限制)。有没有可能的解决方案? 编辑 我只控制来电者的网站 问题答案: 如果您控制双方,那么会有很多选择。例如JSONP,或修改远程网站的标头响应。 不幸的是 ,只有在远程网站支持的情况下,JSONP才有效。您 不能 将JSONP调用强制到尚不支持它的网站。 但是,正如您所说,您只能控制源网站。出于明显的原因,您无法绕过此限制来入侵浏览器。您确实