2012-03-06 24 views
33

Cập nhật - Được trả lời bởi tự Tôi thấy người ta phải đảm bảo rằng DNS được giải quyết đúng từ máy, hãy kiểm tra mã này để đảm bảo rằng url có thể truy cập nodejs.org/ docs/mới nhất/api/dns.html # dns.resolvenodejs httprequest với dữ liệu - nhận được lỗi getaddrinfo ENOENT

Câu hỏi gốc

tôi đang viết một nút chương trình dựa, trong đó người dùng có thể hỏi tôi để làm một HttpRequest thay mặt họ {tắt khóa học họ cung cấp cho tôi một số dữ liệu và phương thức để gọi với} nhưng mỗi khi tôi thực hiện một httprequest, nó cho tôi một lỗi

getaddrinfo ENOENT đây là cách mã của tôi trông

function makehttprequest(deviceid, httpaction, httppath,methods, actiondata, callback) { 
console.log('we are here with httpaction' + httpaction + ' path ' + httppath + ' method ' + methods + ' action data ' + actiondata); 
//do the http post work, get the data, and call the callback function with return data 
var options = { 
    host: httpaction, 
    port: 80, 
    path: httppath, 
    method: methods 
}; 

    try { 
     var req = http.request(options, function(res) { 
     console.log('STATUS: ' + res.statusCode); 
     console.log('HEADERS: ' + JSON.stringify(res.headers)); 
     res.setEncoding('utf8'); 
     res.on('data', function (chunk) { 
      console.log('BODY: ' + chunk); 
     }); 
     }); 
    } catch(e) { 
     console.log('error as : ' + e.message); 
    } 

    req.on('error', function(e) { 
     console.log('problem with request: ' + e.message); 
    }); 

    // write data to request body 
    console.log('writing data to request ..'); 
    req.write(actiondata); 
    console.log('finished writing data to request…'); 
    req.end(); 
    console.log('request ended…'); 
} 
+1

Để sử dụng phát triển cục bộ 127.0.0.1 thay vì localhost –

Trả lời

74

Tôi đã nhìn thấy điều này xảy ra khi máy chủ của bạn (mà bạn vượt qua trong khi httpaction) có chương trình này (như vậy "http: //") ở phía trước của nó. Máy chủ lưu trữ của bạn phải là miền như "www.google.com" không phải là "http://www.google.com" hoặc "www.google.com/hello-world" hoặc "http://www.google.com/hello-world".

Chỉ giữ tên miền đó.

Dưới đây là một ví dụ: http://allampersandall.blogspot.com/2012/03/nodejs-http-request-example.html

+1

+1 cho "www.google.com" giống như tên máy chủ thay vì "http://www.google.com". Điều này giải quyết được vấn đề của tôi. – Eye

+0

Bạn là một chàng trai tuyệt vời! Sẽ không tìm ra điều này. – Slavo

+0

Nếu u cần https: // thì sao? Nếu bạn bỏ qua, mặc định sẽ trở thành http: // –

3

tôi đã nhận được [Lỗi: getaddrinfo ENOENT], nhưng nó đã được ngay sau khi nhận được [Lỗi: kết nối EMFILE]; kể từ khi tôi đang làm thử nghiệm tải với hàng ngàn khách hàng lỗi EMFILE (nguyên nhân gốc) đã được opaqued. Giải pháp là the same as for EMFILE: tăng số lượng bộ mô tả tệp. Chỉ cần thêm nó ở đây để hoàn thành trong trường hợp bất cứ ai khác có cùng một vấn đề.

2

Tôi gặp lỗi này khi gọi server.listen(PORT, HOST); nơi HOST không thể được giải quyết trở lại máy cục bộ.

Khi tôi đã đổi lại tên máy chủ/tên miền/ip mà máy cục bộ đã giải quyết, lỗi này sẽ biến mất.

Kể từ khi tôi đã cố gắng để kết nối thông qua một hostname cho các mục đích dev tôi đã thêm một mục vào file host của tôi với hostname mong muốn và đảm bảo rằng điều này phù hợp với tên máy chủ truyền cho server.listen()

8

vấn đề này cũng có thể xảy ra nếu bạn có một gạch chéo:

Tốt:"www.google.com"

Xấu:"www.google.com/"

3

Tôi nhấn lại lần nữa vào ngày hôm nay vì một sai lầm ngớ ngẩn. Điều này là do số cổng được đặt như một phần của tên máy chủ.

// wrong. gets error getaddrinfo ENOENT 
var options = { 
    hostName: 'localhost:1337', 
    .... 
} 

// correct 
var options = { 
    hostname: 'localhost', 
    port: 1337, 
}; 
+0

Nếu bạn đang kéo tên máy chủ từ các tiêu đề yêu cầu (phổ biến cho proxy), chỉ cần request.headers ['host']. Split (':') [0] để thoát khỏi cổng – netpoetica

0

Nếu tất cả các mã của bạn có vẻ là ổn và bạn vẫn có được cùng một lỗi, đó là trường hợp của tôi, giải pháp đã kiểm tra máy chủ định danh trên tệp /etc/resolv.conf của tôi.

Tôi đã thêm máy chủ định danh của Google vào đầu tệp resolv.conf (8.8.8.8) và mã bắt đầu hoạt động tốt một lần nữa, không còn lỗi nữa. Cần lưu ý rằng lỗi này bắt đầu xảy ra vào tôi vào ngày 4 tháng 2 năm 2015 sau khi tôi chạy một số sudo apt-get upgrade, nút js của tôi phải được cập nhật và một lỗi được giới thiệu có vẻ không tương thích với máy chủ định danh mà tôi có. Lúc đầu, tôi đã kiểm tra xem mình có gặp phải sự cố DNS nào không bằng cách tìm URL mà tôi cần bằng cách sử dụng wget trên dòng lệnh, tôi nhận nội dung của url mục tiêu tốt nên tôi không nghĩ đó thực sự là vấn đề DNS, nhưng nó đã được.

0

Tôi gặp sự cố tương tự nhưng chạy dưới dạng hàm AWA Lambda, vì vậy trong trường hợp ai đó gặp vấn đề này với hàm Lambda thì đây là cách tôi giải quyết vấn đề.

  • Đặt hàm Lambda của bạn là VPC.
  • Chọn ít nhất 2 mạng con.
  • Và chọn một nhóm bảo mật.

Tôi đã dành một ngày cho đến khi tôi tìm thấy bản sửa lỗi này, hy vọng nó sẽ giúp người khác.

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