Node.js getaddrinfo ENOTFOUND

时间:2013-07-17 03:54:19

标签: node.js

使用Node.js尝试获取以下网页的html内容时:

eternagame.wikia.com/wiki/EteRNA_Dictionary

我收到以下错误:

events.js:72
    throw er; // Unhandled 'error' event
          ^
Error: getaddrinfo ENOTFOUND
    at errnoException (dns.js:37:11)
    at Object.onanswer [as oncomplete] (dns.js:124:16)

我确实已经在stackoverflow上查找了这个错误,并意识到这是因为node.js无法从DNS中找到服务器(我认为)。但是,我不确定为什么会这样,因为我的代码完全适用于www.google.com

这是我的代码(实际上是从一个非常相似的问题中复制和粘贴的,除非更改了主机):

var http = require("http");

var options = {
    host: 'eternagame.wikia.com/wiki/EteRNA_Dictionary'
};

http.get(options, function (http_res) {
    // initialize the container for our data
    var data = "";

    // this event fires many times, each time collecting another piece of the response
    http_res.on("data", function (chunk) {
        // append this chunk to our growing `data` var
        data += chunk;
    });

    // this event fires *one* time, after all the `data` events/chunks have been gathered
    http_res.on("end", function () {
        // you can use res.send instead of console.log to output via express
        console.log(data);
    });
});

以下是我复制和粘贴的来源:How to make web service calls in Expressjs?

我没有使用node.js的任何模块。

感谢阅读,

维尼特

19 个答案:

答案 0 :(得分:229)

Node.js HTTP模块的文档中:http://nodejs.org/api/http.html#http_http_request_options_callback

您可以拨打http.get('http://eternagame.wikia.com/wiki/EteRNA_Dictionary', callback),然后使用url.parse()解析网址;或致电http.get(options, callback),其中options

{
  host: 'eternagame.wikia.com',
  port: 8080,
  path: '/wiki/EteRNA_Dictionary'
}

<强>更新

正如@EnchanterIO的评论中所述,port字段也是一个单独的选项;并且协议http://不应包含在host字段中。如果需要SSL,其他答案还建议使用https模块。

答案 1 :(得分:221)

的另一个常见错误来源
Error: getaddrinfo ENOTFOUND
    at errnoException (dns.js:37:11)
    at Object.onanswer [as oncomplete] (dns.js:124:16)
host

中设置options属性时,

正在编写协议(https,https,...)

  // DON'T WRITE THE `http://`
  var options = { 
    host: 'http://yoururl.com',
    path: '/path/to/resource'
  }; 

答案 2 :(得分:16)

在HTTP请求的选项中,将其切换为

var options = { host: 'eternagame.wikia.com', 
                path: '/wiki/EteRNA_Dictionary' };

我认为这会解决你的问题。

答案 3 :(得分:11)

  var http=require('http');
   http.get('http://eternagame.wikia.com/wiki/EteRNA_Dictionary', function(res){
        var str = '';
        console.log('Response is '+res.statusCode);

        res.on('data', function (chunk) {
               str += chunk;
         });

        res.on('end', function () {
             console.log(str);
        });

  });

答案 4 :(得分:11)

如果您需要使用https,请使用https库

https = require('https');

// options
var options = {
    host: 'eternagame.wikia.com',
    path: '/wiki/EteRNA_Dictionary'
}

// get
https.get(options, callback);

答案 5 :(得分:7)

我的问题是我的OS X(Mavericks)DNS服务需要rebooted

答案 6 :(得分:4)

我认为http会在端口80上发出请求,即使我在options对象中提到了完整的主机url。当我运行具有API的服务器应用程序,在端口80上,我之前在端口3000上运行它,它工作。请注意,要在端口80上运行应用程序,您将需要root权限。

Error with the request: getaddrinfo EAI_AGAIN localhost:3000:80

这是一个完整的代码段

var http=require('http');

var options = {
  protocol:'http:',  
  host: 'localhost',
  port:3000,
  path: '/iso/country/Japan',
  method:'GET'
};

var callback = function(response) {
  var str = '';

  //another chunk of data has been recieved, so append it to `str`
  response.on('data', function (chunk) {
    str += chunk;
  });

  //the whole response has been recieved, so we just print it out here
  response.on('end', function () {
    console.log(str);
  });
}

var request=http.request(options, callback);

request.on('error', function(err) {
        // handle errors with the request itself
        console.error('Error with the request:', err.message);        
});

request.end();

答案 7 :(得分:3)

我用这个

修复了这个错误
$ npm info express --verbose
# Error message: npm info retry will retry, error on last attempt: Error: getaddrinfo ENOTFOUND registry.npmjs.org registry.npmjs.org:443
$ nslookup registry.npmjs.org
Server:     8.8.8.8
Address:    8.8.8.8#53

Non-authoritative answer:
registry.npmjs.org  canonical name = a.sni.fastly.net.
a.sni.fastly.net    canonical name = prod.a.sni.global.fastlylb.net.
Name:   prod.a.sni.global.fastlylb.net
Address: 151.101.32.162
$ sudo vim /etc/hosts 
# Add "151.101.32.162 registry.npmjs.org` to hosts file
$ npm info express --verbose
# Works now!

原始来源:https://github.com/npm/npm/issues/6686

答案 8 :(得分:3)

请注意,如果您引用的域出现故障(EG。不再存在),也会出现此问题。

答案 9 :(得分:2)

我收到同样的错误,并使用下面的链接获取帮助:

https://nodejs.org/api/http.html#http_http_request_options_callback

我的代码中没有:

<强> req.end();

(NodeJs V:5.4.0) 一旦添加到req.end();行以上,我就能摆脱错误并为我工作。

答案 10 :(得分:1)

我使用request module尝试了它,并且能够非常轻松地打印出该页面的正文。不幸的是,凭借我的技能,我除此之外无法帮助。

答案 11 :(得分:0)

我摆脱了http和额外的斜杠(/)。 我刚刚使用了这个&#39; node-test.herokuapp.com&#39;它起作用了。

答案 12 :(得分:0)

从开发环境到生产环境时出现此错误。我痴迷于将https://放在所有链接上。这不是必需的,因此它可能是某些人的解决方案。

答案 13 :(得分:0)

如果您仍然面临代理设置的结帐,对我而言,代理设置已丢失且由于直接http / https被阻止而无法发出请求。所以我在发出请求时从我的组织配置了代理。

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"> <proxies> ..... </proxies> </settings>

答案 14 :(得分:0)

我通过从连接密码中删除不需要的字符来解决此问题。例如,我有这些字符:&lt; ##%并且它导致了问题(很可能是哈希标记是问题的根本原因)。

答案 15 :(得分:0)

尝试使用服务器IP地址而不是主机名。 这对我有用。希望它也对您有用。

答案 16 :(得分:0)

我的问题是我们正在解析url并为http.request()生成http_options;

我使用的request_url.host已经具有域名的端口号,因此必须使用request_url.hostname。

var request_url = new URL('http://example.org:4444/path');
var http_options = {};

http_options['hostname'] = request_url.hostname;//We were using request_url.host which includes port number
http_options['port'] = request_url.port;
http_options['path'] = request_url.pathname;
http_options['method'] = 'POST';
http_options['timeout'] = 3000;
http_options['rejectUnauthorized'] = false;

答案 17 :(得分:0)

就我而言,错误是因为使用了不正确的主机值 是

  var options = {
    host: 'graph.facebook.com/v2.12/',
    path: path
  }

应该

  var options = {
    host: 'graph.facebook.com',
    path: path
  }

因此 .com 或 .net 等之后的任何内容都应移至路径参数值

答案 18 :(得分:-6)

我遇到此错误的解决方法是使用节点包管理器安装 http

npm install http-server -g