2013-07-17 18 views
149

Khi sử dụng Node.js để thử và nhận nội dung html của trang web sau đây:Node.js getaddrinfo ENOTFOUND

eternagame.wikia.com/wiki/EteRNA_Dictionary

tôi nhận được lỗi sau:

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) 

tôi đã làm đã tra cứu lỗi này trên stackoverflow và nhận ra rằng điều này là do node.js không thể tìm thấy máy chủ từ DNS (tôi nghĩ). Tuy nhiên, tôi không chắc chắn tại sao điều này lại xảy ra, vì mã của tôi hoạt động hoàn hảo trên www.google.com.

Đây là mã của tôi (thực tế sao chép và dán từ một câu hỏi rất tương tự, trừ trường hợp chủ nhà thay đổi):

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

Đây là nguồn gốc nơi tôi sao chép và dán từ: How to make web service calls in Expressjs?

tôi không sử dụng bất kỳ mô-đun nào có node.js.

Cảm ơn bạn đã đọc,

Vineet

+0

http://stackoverflow.com/a/11921896/2106820 –

Trả lời

164

Trong Node.js tài liệuHTTP mô-đun của: http://nodejs.org/api/http.html#http_http_request_options_callback

Bạn có thể gọi http.get('http://eternagame.wikia.com/wiki/EteRNA_Dictionary', callback), URL sau đó được phân tích với url.parse(); hoặc gọi http.get(options, callback), nơi options

{ 
    host: 'eternagame.wikia.com', 
    path: '/wiki/EteRNA_Dictionary' 
} 
+13

Cảm ơn bạn đã trả lời nhanh, điều này hoạt động hoàn hảo! Tôi cảm thấy như downvoting câu hỏi của riêng tôi cho việc không đọc các tài liệu đầu tiên. –

+2

Vấn đề của tôi là trong tập lệnh nodejs của tôi, tôi đã đưa ra yêu cầu sai địa chỉ và lỗi này đã bị ném. –

+23

Về cơ bản, tổng hợp nó: 1. Chỉ bao gồm tên máy chủ thực trong 'máy chủ', vì vậy không có' http: // 'hoặc' https: // '; và 2.Không bao gồm đường dẫn trong thuộc tính 'host', mà là trong thuộc tính' path'. –

1

Tôi đã thử nó bằng cách sử dụng request module, và đã có thể in cơ thể của trang đó ra khá dễ dàng. Thật không may với những kỹ năng tôi có, tôi không thể giúp gì khác hơn thế.

+0

Cảm ơn các liên kết đến nhưng tôi đã hy vọng làm điều này với thư viện chuẩn node.js, sử dụng http.get(). –

16

trong các tùy chọn cho các yêu cầu HTTP, chuyển đổi nó để

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

Tôi nghĩ rằng tôi sẽ khắc phục vấn đề của bạn.

+1

Cảm ơn bạn đã trả lời! Điều này cũng hoạt động hoàn hảo, nhưng tôi đánh dấu một cái khác là chính xác vì nó có một liên kết đến các tài liệu và hai tùy chọn. –

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) { 
       //console.log('BODY: ' + chunk); 
       str += chunk; 
     }); 

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

    }); 
+0

Cảm ơn câu trả lời! Cũng giống như câu trả lời của Russbear, câu trả lời này hoạt động hoàn hảo nhưng tôi đã đánh dấu đúng yuxhuang bởi vì anh ấy đã đưa ra cả hai tùy chọn và một liên kết đến tài liệu. –

172

Một nguồn phổ biến của lỗi cho

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

đang viết giao thức (https, https, ...) khi đặt host bất động sản trong options

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

CẢM ƠN BẠN! Đã khiến tôi phát điên! –

+5

Đây là lỗi tổng quát hơn so với lỗi được thảo luận. – shaunakde

+4

Cảm ơn bạn đã đăng giải pháp thay thế này, tôi đã chạy chính xác điều này. – Ryan

-5

Giải pháp cho lỗi này đối với tôi là để cài đặt http với người quản lý gói nút:

npm install http-server -g 
+0

Không cài đặt mô-đun nút ứng dụng cụ thể trên phạm vi toàn cầu; bạn sẽ gặp phải tất cả các loại xung đột phụ thuộc. – brandonscript

+0

Ok, vâng, hãy cài đặt http-server rồi ... –

+1

vì vậy có ai đó downvote chỉ vì '-g' được đưa vào? – Maslow

0

tôi đã nhận lỗi này khi đi từ môi trường phát triển đến môi trường sản xuất. Tôi đã bị ám ảnh bởi việc đặt https:// vào tất cả các liên kết. Điều này là không cần thiết, vì vậy nó có thể là một giải pháp cho một số.

5

Vấn đề của tôi là dịch vụ DNS OS X (Mavericks) của tôi cần phải là rebooted.

3

Lưu ý rằng vấn đề này cũng có thể xảy ra nếu các tên miền mà bạn đang tham chiếu đi xuống (. EG không còn tồn tại.)

2

tôi đã nhận được báo lỗi tương tự và sử dụng dưới đây dưới đây liên kết để có được sự giúp đỡ:

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

tôi đã không có trong mã của tôi:

req.end();

(NodeJs V: 5.4.0) một lần được thêm vào phía trên req.end(); dòng, tôi đã có thể loại bỏ lỗi và làm việc tốt cho tôi.

0

Tôi đã loại bỏ dấu gạch chéo http và thêm (/). Tôi chỉ sử dụng 'node-test.herokuapp.com' này và nó hoạt động.

7

Nếu bạn cần phải sử dụng https, sau đó sử dụng thư viện https

https = require('https'); 

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

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

Tôi nghĩ http làm cho yêu cầu trên cổng 80, mặc dù tôi đã đề cập url chủ hoàn toàn trong lựa chọn đối tượng. Khi tôi chạy ứng dụng máy chủ có API, trên cổng 80, mà tôi đã chạy trước đó trên cổng 3000, nó hoạt động. Lưu ý rằng để chạy một ứng dụng trên cổng 80, bạn sẽ cần đặc quyền root.

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

Đây là một mã hoàn chỉnh đoạn mã

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

Điều này làm việc cho tôi :) – Sonu

0

Nếu bạn vẫn đang phải đối mặt thanh toán cho thiết lập proxy, đối với tôi nó là thiết lập proxy đó bị mất tích và đã không thể thực hiện yêu cầu dưới dạng http/https trực tiếp bị chặn. Vì vậy, tôi đã cấu hình proxy từ tổ chức của tôi trong khi đưa ra yêu cầu.

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

Tôi đã giải quyết được vấn đề này bằng cách xóa các ký tự không mong muốn khỏi mật khẩu cho kết nối. Ví dụ, tôi đã có những ký tự này: < ##% và nó gây ra vấn đề (hầu hết có lẽ thẻ băm là nguyên nhân gốc rễ của vấn đề).

1

tôi sửa lại lỗi này với điều này

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

nguồn gốc: https://github.com/npm/npm/issues/6686

Các vấn đề liên quan