2012-04-09 13 views
31

Mam aplikacji, które mam za odwrotnego proxy, chciałbym go tylko słuchać localhost/127.0.0.1.Jak zdobyć Node.JS Express, aby słuchać tylko na localhost?

Spodziewałem się to do pracy:

app.listen(3001, 'localhost');

lub

app.listen(3001, '127.0.0.1');

... ale zamiast tego pojawia się błąd:

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) 

Uruchamianie aplikacji bez a określając nazwa hosta działa dobrze, tj., app.listen(3001);.

używam węzła v0.6.14 i wyrazić @2.5.5 i przeczytałem tę google groups discussion i odkryli this comment Ekspresowe application.js mówiąc: „Ta metoda pobiera te same argumenty co węzła http.Server#listen()

Dzięki za pomoc.

+0

Czy możesz podać ślad stosu błędu? Samo podanie tekstu nie jest zbyt użyteczne. – loganfsmyth

+0

Edytowane pytanie – nak

+0

To jest błąd w twoim pliku 'go.js' na linii' 204'. Co robi ta linia? Czy mógłbyś trochę więcej kodu? – loganfsmyth

Odpowiedz

34

Dzięki za informacje, myślę, że widzę problem. To jest błąd w hive-go, który pojawia się tylko po dodaniu hosta. Ostatnie linie niej są:

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

Po dodaniu hosta na pierwszej linii, jest upaść, gdy nazywa app.address().port.

Problem to potencjalnie asynchroniczny charakter .listen(). Naprawdę powinno to być wykonywanie tego połączenia console.log wewnątrz wywołania zwrotnego przekazanego do nasłuchiwania. Po dodaniu hosta próbuje on przeprowadzić wyszukiwanie DNS, które jest asynchroniczne. Więc kiedy ta linia próbuje pobrać adres, nie ma jeszcze, ponieważ żądanie DNS jest uruchomione, więc ulega awarii.

Spróbuj tego:

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

Dzięki, skomentowałem konsolę.log ... asynchroniczne zastrzeżenie po prostu mnie nie przyszło, okrzyki! – nak

21

Państwo mają ten problem, ponieważ starają się pocieszyć zalogować app.address() zanim połączenie zostało wykonane. Musisz tylko upewnić się, że logujesz się po nawiązaniu połączenia, tj. W wywołaniu zwrotnym lub po sygnalizacji, że połączenie zostało nawiązane.

Na szczęście, „słuchać” zdarzenie jest emitowany przez serwer po nawiązaniu połączenia, więc po prostu to zrobić:

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

To działa dobrze w nodejs v0.6 + i wyrażać v3.0 +.

Powiązane problemy