Vineet Kosaraju
Vineet Kosaraju

Reputation: 5860

Node.js getaddrinfo ENOTFOUND

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.

Upvotes: 420

Views: 1228071

Answers (21)

Rosty
Rosty

Reputation: 121

The issue could be caused by missing record in /etc/hosts file, in this case error message mentions particular host, like this:

Error: getaddrinfo ENOTFOUND somename.somedomain.com

it could be fixed by adding a corresponding record to /etc/hosts, like this:

127.0.0.1 somename.somedomain.com

Upvotes: 0

ozgeneral
ozgeneral

Reputation: 6819

I got this error only when I was using subdomains with localhost. It turns out, somehow the OS can't resolve test.localhost to localhost if it's not connected to internet (thus messing with my development workflow while offline)

See https://github.com/nodejs/node/issues/50871 for details.

TLDR here is a workaround solution:

var axios = require("axios")
var http_adapter = require('axios/lib/adapters/http')
var settle = require('axios/lib/core/settle')

await axios.get("http://monitoring.localhost:3005", {
    adapter: (config) => {

        const regex = /(?<prefix>^https?:\/\/)(?<subdomain>.*\.)(?<suffix>localhost.*)/gi
        const subdomain_matches = Array.from(config.url.matchAll(regex))
        if (subdomain_matches.length > 0) {
            config.headers["Host"] = config.url
            config.url = `${subdomain_matches[0].groups.prefix}${subdomain_matches[0].groups.suffix}`
        }

        return new Promise((resolve, reject) => {
            http_adapter(config).then(response => {settle(resolve, reject, response)}).catch(reject)
        })
    }
})

Upvotes: 0

Sterling Diaz
Sterling Diaz

Reputation: 3873

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

Upvotes: 5

aaaidan
aaaidan

Reputation: 7346

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.

Upvotes: 31

kashlo
kashlo

Reputation: 2627

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

Upvotes: 3

Arjun J Gowda
Arjun J Gowda

Reputation: 730

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;

Upvotes: 1

Hemantkumar Gaikwad
Hemantkumar Gaikwad

Reputation: 721

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

Upvotes: 1

Mertcan Diken
Mertcan Diken

Reputation: 15371

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

Upvotes: 7

yuxhuang
yuxhuang

Reputation: 5389

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.

Upvotes: 389

sachin
sachin

Reputation: 14385

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

  });

Upvotes: 11

Shota
Shota

Reputation: 7360

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).

Upvotes: 1

Ansar Ahmed
Ansar Ahmed

Reputation: 31

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

Upvotes: 0

Mahtab Alam
Mahtab Alam

Reputation: 1870

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

Upvotes: 10

j--
j--

Reputation: 5676

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

Upvotes: 286

sudeep patel
sudeep patel

Reputation: 31

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.

Upvotes: 1

Andrew
Andrew

Reputation: 3613

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

Upvotes: 12

Uday Reddy
Uday Reddy

Reputation: 1481

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

Upvotes: 0

Mauvis Ledford
Mauvis Ledford

Reputation: 42384

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

Upvotes: 3

petur
petur

Reputation: 1386

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.

Upvotes: 1

mayorbyrne
mayorbyrne

Reputation: 507

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.

Upvotes: 1

Russbear
Russbear

Reputation: 1261

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.

Upvotes: 22

Related Questions