2012-03-06 1 views
33

업데이트 - 자동 응답 DNS가 컴퓨터에서 제대로 확인되었는지 확인하려면이 코드를 통해 URL에 도달 할 수 있는지 확인하십시오. nodejs.org/ 문서/최신/API/dns.html #의 dns.resolvenodejs httprequest with data - getaddrinfo ENOENT

원래의 질문에

내가 그들을 대신하여 {오프 코스에서 HttpRequest를 할 사용자가 부탁 할 수있는 프로그램을 기반으로 노드를 쓰고 있어요 그들은 몇 가지 데이터와 함께 전화 할 수있는 방법을 제공합니다.}하지만 httprequest를 할 때마다 오류가납니다.

앞에 : ("// HTTP"그래서)

한다 getaddrinfo의 ENOENT 이 내 코드는 내가 (당신이 httpaction로 통과) 호스트는 계획이있는 경우 이런 일이 본 적이

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

로컬 개발의 경우 localhost 대신 127.0.0.1을 사용하십시오. –

답변

74

을 모습입니다 그것의. 귀하의 호스트는 엄격하게 "http://www.google.com"또는 "www.google.com/hello-world"또는 "http://www.google.com/hello-world"이 아닌 "www.google.com"과 같은 도메인이어야합니다.

그냥 도메인으로 유지하십시오. 여기

은 예입니다 : http://allampersandall.blogspot.com/2012/03/nodejs-http-request-example.html

+1

+1 "http://www.google.com"대신 호스트 이름과 같은 "www.google.com"을 입력하십시오. 이것은 내 문제를 해결했다. – Eye

+0

당신은 놀라운 사람입니다! 이걸 알아 내지 못했을거야. – Slavo

+0

https : //가 필요한 경우 어떻게해야합니까? 건너 뛰면 기본값은 http : // –

3

내가 얻고 있었다 [오류 : getaddrinfo를 ENOENT]을하지만, 그것이 바로 점점 후 [오류 : 연결 EMFILE] 수천 개의 클라이언트로로드 테스트를 수행하고 있기 때문에 EMFILE 오류 (근본 원인)가 불투명하게되었습니다. 해결 방법은 the same as for EMFILE : 파일 설명자 수를 늘립니다. 다른 사람에게 같은 문제가있는 경우에 대비하여 여기에 추가하여 완성도를 높이십시오.

2

호 스트를 로컬 시스템으로 다시 확인할 수없는 server.listen(PORT, HOST);을 호출 할 때이 오류가 발생했습니다.

일단 로컬 시스템이 확인한 호스트 이름/도메인 이름/ip로 변경하면이 오류가 사라집니다. 내가 내 호스트가 원하는 호스트 이름 파일에 항목을 추가하고 이것이 당신이있는 경우에도 발생할 수 있습니다 server.listen()

8

문제에 전달 된 호스트 이름과 일치하는 것을 보장 dev에 목적 호스트 이름을 통해 연결을 시도 이후

후행 슬래시 :

좋은 : 나쁜"www.google.com"

:"www.google.com/"

3

어리석은 실수로 오늘 다시 한 번 쳤습니다. 포트 번호가 호스트 이름의 일부로 입력 되었기 때문입니다.

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

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

요청 헤더 (호스트 공통)에서 호스트 이름을 가져 오려면 request.headers [ 'host']. split (':') [0]을 사용하여 포트를 없애기 만하면됩니다. – netpoetica

0

request 모듈을 사용하여 이러한 호스트/프로토콜/포트/슬래시의 모든 문제 모든 코드는 괜찮을 것 같으면 당신은 여전히 ​​얻을 수있어 제 경우의 동일한 오류, 해결책은 내 /etc/resolv.conf 파일에서 네임 서버를 검사하고있었습니다.

resolv.conf 파일 (8.8.8.8)의 시작 부분에 Google의 네임 서버를 추가 했으므로 코드가 다시 정상적으로 작동하기 시작했습니다. 더 이상 오류가 없습니다.

sudo apt-get upgrade을 실행 한 후 2015 년 2 월 4 일에이 오류가 발생하여 내 노드 j가 업데이트되어 있어야하고 버그가 발생하여 이름 서버와 호환되지 않는 것으로 나타났습니다.

처음에는 명령 줄에서 wget을 사용하여 필요한 URL을 가져 와서 DNS 문제가 있는지 확인한 결과 실제로 DNS 문제라고 생각하지 않았으므로 대상 URL의 내용을 알게되었습니다. 하지만 그것은.

0

비슷한 문제점이 있지만 AWS Lambda 함수로 실행되었으므로 누군가 Lambda 함수로이 문제가 발생하는 경우 이것이 해결 방법입니다.

  • 람다 함수에 VPC를 지정하십시오.
  • 적어도 2 개의 서브넷을 선택하십시오.
  • 보안 그룹을 선택하십시오.

이 수정 프로그램이 발견 될 때까지 하루를 보냈습니다. 다른 사람에게 도움이되기를 바랍니다.