Nodejs http.get在本地虚拟机调试时一切正常,传到服务器就不行了,报错getaddrinfo ENOENT

Nodejs http.get在本地虚拟机调试时一切正常,传到服务器就不行了,报错getaddrinfo ENOENT

代码: <pre><code> var http = require(‘http’), url = require(‘url’), urls = ‘http://127.0.0.1:81/’; var u = url.parse(urls), p = u[‘port’] ? u[‘port’] : 80; http.get({ host: u[‘host’], port: p, path: u[‘path’] }, function(res){ if (res.statusCode == 200){ res.setEncoding(‘utf8’); res.on(‘data’, function (chunk) { log(urls+":\n" + chunk); }); }else{ log(urls+":\n" + res.statusCode); } } ).on(‘error’, function(e){ log("Got error: " + e.message);//这里报getaddrinfo ENOENT }); </code></pre>

在sh下用wget http://127.0.0.1:81/一切正常
在node不加81端口,也一切正常


4 回复

Node.js http.get 在本地虚拟机调试时一切正常,传到服务器就不行了,报错 getaddrinfo ENOENT

问题描述

当你在本地虚拟机上使用 http.get 进行请求时,一切正常。但当将同样的代码部署到服务器后,请求失败并抛出 getaddrinfo ENOENT 错误。

原因分析

getaddrinfo ENOENT 错误通常表示 Node.js 无法解析主机名或 IP 地址。这可能是因为:

  • 服务器上的 DNS 解析存在问题。
  • 目标主机不可达或未正确配置。
  • 网络连接问题。

示例代码

var http = require('http');
var url = require('url');

// 示例 URL
var urls = 'http://127.0.0.1:81/';

// 解析 URL
var u = url.parse(urls);
var port = u.port ? u.port : 80;

http.get({
    host: u.host,
    port: port,
    path: u.path
}, function(res) {
    if (res.statusCode == 200) {
        res.setEncoding('utf8');
        res.on('data', function(chunk) {
            console.log(urls + ":\n" + chunk);
        });
    } else {
        console.log(urls + ":\n" + res.statusCode);
    }
}).on('error', function(e) {
    console.error("Got error: " + e.message); // 这里报 getaddrinfo ENOENT
});

解决方案

  1. 检查目标主机是否可达:

    • 确保服务器可以访问目标主机的 IP 地址或域名。
    • 使用 pingcurl 工具来测试连通性。
  2. 检查 DNS 解析:

    • 确保服务器的 DNS 配置正确。
    • 可以使用 nslookupdig 命令来检查 DNS 解析是否正常。
  3. 确保防火墙和网络配置允许请求:

    • 检查服务器上的防火墙设置,确保允许从外部访问目标主机的端口。
    • 确认服务器的网络配置(如路由表)没有阻止请求。
  4. 使用 IP 地址而不是域名:

    • 如果域名解析有问题,可以尝试直接使用 IP 地址进行请求。

示例:使用 IP 地址

var http = require('http');
var url = require('url');

// 示例 URL
var urls = 'http://192.168.1.1:81/';

// 解析 URL
var u = url.parse(urls);
var port = u.port ? u.port : 80;

http.get({
    host: u.host,
    port: port,
    path: u.path
}, function(res) {
    if (res.statusCode == 200) {
        res.setEncoding('utf8');
        res.on('data', function(chunk) {
            console.log(urls + ":\n" + chunk);
        });
    } else {
        console.log(urls + ":\n" + res.statusCode);
    }
}).on('error', function(e) {
    console.error("Got error: " + e.message);
});

通过以上步骤,你应该能够解决 getaddrinfo ENOENT 错误,并使你的 Node.js 应用在服务器上正常运行。


解决了,唉,造孽
如果url有端口,解析完后u[‘host’]里面也包含着,他里面的值是127.0.0.1:81,我还以为是127.0.0.1,这样写就可以了: <pre><code> var u = url.parse(urls), p = u[‘port’] ? u[‘port’] : 80, h = u[‘host’].split(’:’); h = h[0]; log(h); log§; http.get({ host: h, port: p, path: u[‘path’] }, </code></pre>

我也碰到了这个问题,我也补充一点,以免下次还有人遇到类似的情况,也多个思路 req就是http.request或get返回的httpClientRequest对象 req.on(“error”,function(err){ console.log(err); //如果这里也得到以下错误 { [Error: getaddrinfo ENOTFOUND] code: ‘ENOTFOUND’, errno: ‘ENOTFOUND’, syscall: ‘getaddrinfo’ } });

有可能是你的options的host加了http了,host是不需要http,本机直接localhost或 127.0.0.1,如下: var options={ host:‘localhost’, method:‘POST’, port:8080, path:’/aa/bb/cc’, headers:{ ‘Content-Type’:“application/x-www-form-urlencoded”, ‘Content-Length’:20 } };

从描述来看,问题可能是由于在服务器上无法解析主机名导致的。getaddrinfo ENOENT 错误通常表示 Node.js 在尝试解析主机名时遇到了问题。以下是一些可能的原因和解决方案:

可能的原因

  1. DNS 解析问题:服务器可能没有正确配置 DNS,导致无法解析特定的主机名。
  2. 网络限制:服务器可能被防火墙或其他网络策略阻止访问外部或内部特定端点。

解决方案

  1. 检查 URL:确保你在 http.get 中使用的 URL 是正确的,并且可以从服务器访问。
  2. 使用 IP 地址:如果使用的是域名,可以先确认是否可以 ping 通该域名。如果不行,尝试使用 IP 地址进行测试。
  3. 网络配置:确保服务器网络配置允许访问目标主机。

示例代码

var http = require('http'), 
    url = require('url'),
    urls = 'http://127.0.0.1:81/'; // 尝试使用 IP 地址
        
var u = url.parse(urls), 
    p = u['port'] ? u['port'] : 80;

http.get({
    host: u['host'],
    port: p,
    path: u['path']
}, 
function(res){
    if (res.statusCode == 200){
        res.setEncoding('utf8');
        res.on('data', function(chunk) {
            console.log(urls + ":\n" + chunk);
        });
    } else {
        console.log(urls + ":\n" + res.statusCode);
    }
}).on('error', function(e) {
    console.error("Got error: " + e.message); // 这里报getaddrinfo ENOENT
});

调试步骤

  1. 检查 URL:确认 urls 的值是正确的。
  2. 网络连通性测试:在服务器上使用 pingcurl 测试能否访问目标主机。
    ping 127.0.0.1
    curl -v http://127.0.0.1:81/
    

通过以上方法可以诊断并解决这个问题。

回到顶部