396

When using Node.js to try and get the html content of the following web page:

eternagame.wikia.com/wiki/EteRNA_Dictionary

I get the following error:

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)

I did already look up this error on stackoverflow, and realized that this is because node.js cannot find the server from DNS (I think). However, I am not sure why this would be, as my code works perfectly on www.google.com.

Here is my code (practically copied and pasted from a very similar question, except with the host changed):

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);
    });
});

Here is the source where I copied and pasted from : How to make web service calls in Expressjs?

I am not using any modules with node.js.

Thanks for reading.

Alfabravo
  • 7,493
  • 6
  • 46
  • 82
Vineet Kosaraju
  • 5,572
  • 2
  • 19
  • 21

19 Answers19

379

In Node.js HTTP module's documentation: http://nodejs.org/api/http.html#http_http_request_options_callback

You can either call http.get('http://eternagame.wikia.com/wiki/EteRNA_Dictionary', callback), the URL is then parsed with url.parse(); or call http.get(options, callback), where options is

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

Update

As stated in the comment by @EnchanterIO, the port field is also a separate option; and the protocol http:// shouldn't be included in the host field. Other answers also recommends the use of https module if SSL is required.

yuxhuang
  • 5,279
  • 1
  • 18
  • 13
  • 3
    My issue was that within my nodejs script I was making a request to the wrong url and this error was thrown. – Michael J. Calkins Dec 12 '13 at 06:36
  • 90
    So basically, to sum it up: 1. Only include the actual hostname in `host`, so no `http://` or `https://`; and 2. Don't include the path in the `host` property, but rather in the `path` property. – Eduard Luca Apr 09 '15 at 15:20
  • 1
    My sample code in _Learning Node_ did not make this clear to me. Now I understand why I got strange failures when I filled out the ``options {...}`` block. – Michael Shopsin May 04 '15 at 15:40
  • + make sure the port is also in a separate option attribute from host. – Lukas Lukac Jul 30 '18 at 14:14
  • As stated by @Jorge Bucaran in a separate Answer : IT IS UTTERLY IMPORTANT to not include http:// in the option.host definition (was the main reason of my error) – Deunz Feb 14 '19 at 10:38
  • 1
    I had included https:// in the host, removing this helped to fix the issue. Thanks @yuxhuang – shary.sharath Apr 18 '22 at 09:21
284

Another common source of error for

Error: getaddrinfo ENOTFOUND
    at errnoException (dns.js:37:11)
    at Object.onanswer [as oncomplete] (dns.js:124:16)

is writing the protocol (https, https, ...) when setting the host property in options

  // DON'T WRITE THE `http://`
  var options = { 
    host: 'http://yoururl.com',
    path: '/path/to/resource'
  }; 
Jorge Bucaran
  • 5,588
  • 2
  • 30
  • 48
25

My problem was that my OS X (Mavericks) DNS service needed to be restarted. On Catalina and Big Sur DNS cache can be cleared with:

sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

Older macOS versions see here.

vhs
  • 9,316
  • 3
  • 66
  • 70
aaaidan
  • 7,093
  • 8
  • 66
  • 102
22

in the options for the HTTP request, switch it to

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

I think that'll fix your problem.

Russbear
  • 1,261
  • 1
  • 11
  • 22
  • 1
    Thanks for the answer! This also works perfectly, but I marked the other one as correct because it has a link to the docs and two options. – Vineet Kosaraju Jul 17 '13 at 15:43
12

If you need to use https, then use the https library

https = require('https');

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

// get
https.get(options, callback);
Andrew
  • 3,545
  • 4
  • 31
  • 37
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);
        });

  });
sachin
  • 13,605
  • 14
  • 42
  • 55
  • Thanks for the answer! Just like Russbear's answer, this one works perfectly but I marked yuxhuang's correct because he gave both options and a link to the docs. – Vineet Kosaraju Jul 17 '13 at 15:43
  • 4
    Just code without explaining what the problem and what the solution is not really a complete answer, I don't see what you did in your block of code, thanks. – Al-Mothafar Jul 19 '18 at 12:26
9

I think http makes request on port 80, even though I mentioned the complete host url in options object. When I run the server application which has the API, on port 80, which I was running previously on port 3000, it worked. Note that to run an application on port 80 you will need root privilege.

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

Here is a complete code snippet

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();
Mahtab Alam
  • 1,810
  • 3
  • 23
  • 40
  • the important part in this answer is protocol. nodejs http did not support full uri with `host: https://server.com`, which is mentioned here as well https://stackoverflow.com/a/28385129/432903 – prayagupa Dec 09 '18 at 22:18
6

I fixed this error with this

$ 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!

Original source: https://github.com/npm/npm/issues/6686

eyllanesc
  • 235,170
  • 19
  • 170
  • 241
Mertcan Diken
  • 14,483
  • 2
  • 26
  • 33
4

Note that this issue can also occur if the domain you are referencing goes down (EG. no longer exists.)

Mauvis Ledford
  • 40,827
  • 17
  • 81
  • 86
3

in my case error was because of using incorrect host value was

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

should be

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

so anything after .com or .net etc should be moved to path parameter value

kashlo
  • 2,313
  • 1
  • 28
  • 39
3

In my case the problem was a malformed URL. I had double slashes in the URL.

Sterling Diaz
  • 3,789
  • 2
  • 31
  • 35
1

I tried it using the request module, and was able to print the body of that page out pretty easily. Unfortunately with the skills I have, I can't help other than that.

mayorbyrne
  • 495
  • 1
  • 5
  • 16
1

I got this error when going from development environment to production environment. I was obsessed with putting https:// on all links. This is not necessary, so it may be a solution for some.

petur
  • 1,366
  • 3
  • 21
  • 42
1

I was getting the same error and used below below link to get help:

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

I was not having in my code:

req.end();

(NodeJs V: 5.4.0) once added above req.end(); line, I was able to get rid of the error and worked fine for me.

Sayuri Mizuguchi
  • 5,250
  • 3
  • 26
  • 53
1

Try using the server IP address rather than the hostname. This worked for me. Hope it will work for you too.

0

I got rid of http and extra slash(/). I just used this 'node-test.herokuapp.com' and it worked.

Uday Reddy
  • 1,337
  • 3
  • 16
  • 38
0

If still you are facing checkout for proxy setting, for me it was the proxy setting which were missing and was not able to make the request as direct http/https are blocked. So i configured the proxy from my organization while making the request.

npm install https-proxy-agent 
or 
npm install http-proxy-agent

const httpsProxyAgent = require('https-proxy-agent');
const agent = new httpsProxyAgent("http://yourorganzation.proxy.url:8080");
const options = {
  hostname: 'encrypted.google.com',
  port: 443,
  path: '/',
  method: 'GET',
  agent: agent
};
0

I got this issue resolved by removing non-desirable characters from the password for the connection. For example, I had these characters: <##% and it caused the problem (most probably hash tag was the root cause of the problem).

Shota
  • 6,910
  • 9
  • 37
  • 67
0

My problem was we were parsing url and generating http_options for http.request();

I was using request_url.host which already had port number with domain name so had to use 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;
Arjun J Gowda
  • 720
  • 10
  • 21