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端口,也一切正常
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
});
解决方案
-
检查目标主机是否可达:
- 确保服务器可以访问目标主机的 IP 地址或域名。
- 使用
ping
或curl
工具来测试连通性。
-
检查 DNS 解析:
- 确保服务器的 DNS 配置正确。
- 可以使用
nslookup
或dig
命令来检查 DNS 解析是否正常。
-
确保防火墙和网络配置允许请求:
- 检查服务器上的防火墙设置,确保允许从外部访问目标主机的端口。
- 确认服务器的网络配置(如路由表)没有阻止请求。
-
使用 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 在尝试解析主机名时遇到了问题。以下是一些可能的原因和解决方案:
可能的原因
- DNS 解析问题:服务器可能没有正确配置 DNS,导致无法解析特定的主机名。
- 网络限制:服务器可能被防火墙或其他网络策略阻止访问外部或内部特定端点。
解决方案
- 检查 URL:确保你在
http.get
中使用的 URL 是正确的,并且可以从服务器访问。 - 使用 IP 地址:如果使用的是域名,可以先确认是否可以 ping 通该域名。如果不行,尝试使用 IP 地址进行测试。
- 网络配置:确保服务器网络配置允许访问目标主机。
示例代码
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
});
调试步骤
- 检查 URL:确认
urls
的值是正确的。 - 网络连通性测试:在服务器上使用
ping
或curl
测试能否访问目标主机。ping 127.0.0.1 curl -v http://127.0.0.1:81/
通过以上方法可以诊断并解决这个问题。