node.js - 在 http post 导致 : getaddrinfo EADDRINFO 后工作

标签 node.js http

我有一个 nodejs 代码在测试时通过 HTTP 在本地主机上发布数据,我发现一旦连接数达到 1024,它就会开始出现以下错误:

getaddrinfo EADDRINFO

我增加了最大连接限制并通过建立更多连接测试了 HTTP 服务器,同时我使用 curl 通过 Node 代码收到此错误,它能够毫无故障地建立连接。

这是发布数据的代码片段:

function post(message, domain, callback){
        var self=this;
        var json = JSON.stringify(message);
        var p = url.parse(domain);
        var headers = {
            'Content-Type': 'application/json',
            'Content-Length': json.length
        };

        console.log('hostname: ' + p.hostname);
        var options = {
            host: p.hostname,
            port: p.port,
            path: p.pathname,
            method: 'POST',
            headers: headers
        };

        var req = http.request(options, function(res) {
            res.setEncoding('utf-8');
            var responseString = '';
            res.on('data', function(data) {
                responseString += data;
            });

            res.on('end', function() {
                logger.info(responseString);
                self.responseQ.push(responseString);
                callback(self,message,'success');
            });
        });

        req.on('error', function(e) {
            //TODO: handle error.
            logger.error('[e] Error while posting: '+e);
            callback(self, message,'failure');
        });
        logger.info("post: "+json);
        req.write(json);
        req.end();

    }

我认为可能存在一些问题(即使我使用的是本地主机)我尝试用 IP 地址替换 host;然后在工作 2 分钟后,相同的代码开始以类似的方式出现以下错误:

Error: connect EMFILE

什么可能导致代码在两者之间中断?

如有任何帮助,我们将不胜感激。

最佳答案

在尝试了多种方案后,我发现可能导致此问题的原因如下:

  1. 如果您使用的是域名(DNS 可能是个问题)
  2. 您进程的最大文件限制。

在我的案例中,失败的具体原因是案例 2;在这种情况下,我的 nodejs 进程可以打开的文件的最大限制被限制为 1024 而网络服务器可以接受更多连接。

在这种情况下所需要做的就是更改限制。

  1. 检查您的用户的限制: $su - 用户名 $ulimit -Hn $ulimit -Sn
  2. 根据您的需要更改值:

    vi/etc/security/limits.conf

添加以下几行

username soft nofile 4096
username hard nofile 10240
  1. 更改系统范围内打开文件的限制:

    vi/etc/sysctl.conf

添加以下行

fs.file-max = 100000
  1. 最后通过重复第 1 步来检查您的更改,以确保正确应用所有所做的更改。

关于node.js - 在 http post 导致 : getaddrinfo EADDRINFO 后工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32897287/

相关文章:

java - 如何仅在 HTTP 请求连接器中提供地址?

python - 从 nginx 传递到 uwsgi 的客户端连接 ID

javascript - 在使用 CORS 和 Mandrill 的 Node Express 中无法找出 "No ' Access-Control-Allow-Origin' header

arrays - 如何使用 Mongoose 从数组中删除对象

javascript - 用fs从C盘读取文件出错

c# - 对同一 http 主机的多个同时请求

java - ServerSocket是如何接收HTTP请求的?

javascript - 错误 "Your cache folder contains root-owned files, due to a bug in previous versions of npm"而 "npx create-react-app example_app"

javascript - Mongodb insertOne改变数据?

java - 可恢复文件下载协议(protocol)