Reputation: 5860
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
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
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
Reputation: 3873
In my case the problem was a malformed URL. I had double slashes in the URL.
Upvotes: 5
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
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
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
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
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
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
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
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
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
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
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
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
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
Reputation: 1481
I got rid of http and extra slash(/). I just used this 'node-test.herokuapp.com' and it worked.
Upvotes: 0
Reputation: 42384
Note that this issue can also occur if the domain you are referencing goes down (EG. no longer exists.)
Upvotes: 3
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
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
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