2012-04-09 4 views
31

나는 리버스 프록시 뒤에있는 응용 프로그램을 가지고 있는데, localhost/127.0.0.1만을 듣고 싶습니다. Node.JS Express가 localhost에서만 수신 대기하는 방법은 무엇입니까?

나는이 작업을 예상 :

app.listen(3001, 'localhost');

또는

app.listen(3001, '127.0.0.1');

을 ... 대신 내가 오류 얻을 :

node.js:201 
    throw e; // process.nextTick error, or 'error' event on first tick 
     ^
TypeError: Cannot read property 'port' of null 
    at Object.<anonymous> (/home/ctoledo/hive-go/go.js:204:76) 
    at Module._compile (module.js:441:26) 
    at Object..js (module.js:459:10) 
    at Module.load (module.js:348:31) 
    at Function._load (module.js:308:12) 
    at Array.0 (module.js:479:10) 
    at EventEmitter._tickCallback (node.js:192:40) 

응용 프로그램없이 실행을 지정 hostname은 잘 작동합니다 (예 : app.listen(3001);).

나는 노드 v0.6.14을 실행하고 2.5.5 @ 표현이 google groups discussion을 읽었으며 Express에서 this comment 말 application.js 발견하고 ".이 방법은 노드의 http.Server#listen() 같은 인수를"

도움 주셔서 감사합니다.

+0

오류의 스택 추적을 제공 할 수 있습니까? 그냥 텍스트를주는 것은별로 유용하지 않습니다. – loganfsmyth

+0

수정 된 질문 – nak

+0

'go.js' 파일의'204' 행에 오류가 있습니다. 그 선은 뭐하고 있니? 좀 더 코드가 필요합니까? – loganfsmyth

답변

34

정보 주셔서 감사합니다. 문제가 있다고 생각합니다. 이는 호스트를 추가 할 때만 나타나는 hive-go의 버그입니다. 그것의 마지막 줄은 다음과 같습니다

app.listen(3001); 
console.log("... port %d in %s mode", app.address().port, app.settings.env); 

첫 번째 줄에 호스트를 추가 할 때이 app.address().port를 호출 할 때, 그것은 충돌한다.

문제는 잠재적으로 비동기 성질이 .listen()입니다. 실제로 그것은 듣고 전달 된 콜백 내에서 console.log 호출을 수행해야합니다. 호스트를 추가하면 비동기 DNS 조회를 시도합니다. 따라서 해당 행이 주소를 가져 오려고 시도 할 때 DNS 요청이 실행 중이기 때문에 아직 행이 없기 때문에 충돌이 발생합니다.

이 시도 : 당신이 연결이되기 전에() app.address 로그 콘솔을 시도하고 있기 때문에

app.listen(3001, 'localhost', function() { 
    console.log("... port %d in %s mode", app.address().port, app.settings.env); 
}); 
+0

감사합니다. console.log를 주석 처리했습니다. 비동기 적 경고가 나에게 발생하지 않았어요. 건배! – nak

21

당신은이 문제가된다. 연결이 이루어진 후, 즉 콜백에서 또는 연결이 이루어진 것으로 신호를 보내는 이벤트 후에 로그를 콘솔 링해야합니다.

var express = require('express'); 
var http = require('http'); 

var app = express(); 
var server = http.createServer(app); 

app.get('/', function(req, res) { 
    res.send("Hello World!"); 
}); 

server.listen(3000, 'localhost'); 
server.on('listening', function() { 
    console.log('Express server started on port %s at %s', server.address().port, server.address().address); 
}); 

이 nodejs v0.6 +와 익스프레스 버전 3.0 +에서 잘 작동 : 연결이 설정되면, 그래서 그냥 이렇게

다행히도, '듣기'이벤트는 서버에 의해 방출된다.

관련 문제