2012-04-09 10 views
31

Tengo una aplicación que tengo detrás de un proxy inverso, me gustaría que solo escuche localhost/127.0.0.1.¿Cómo obtener Node.JS Express para escuchar solo en localhost?

que esperaba que esto funcione:

app.listen(3001, 'localhost');

o

app.listen(3001, '127.0.0.1');

... pero en su lugar me da un error:

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) 

Ejecución de la aplicación sin un especificando el nombre de host funciona bien, es decir, app.listen(3001);.

Me postulo Nodo v0.6.14 y expreso @2.5.5 y leído este google groups discussion y han encontrado this comment in exprés application.js diciendo: "Este método utiliza los mismos argumentos que el nodo de http.Server#listen()"

Gracias por cualquier ayuda.

+0

¿Puedes dar el rastro de pila del error? Solo dar el texto no es muy útil. – loganfsmyth

+0

Pregunta editada – nak

+0

Eso es un error en su archivo 'go.js' en la línea' 204'. ¿Qué está haciendo esa línea? ¿Podrías necesitar un poco más de código? – loganfsmyth

Respuesta

34

Gracias por la información, creo que veo el problema. Este es un error en hive-go que solo aparece cuando agrega un host. Las últimas líneas de la misma son:

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

Cuando se agrega el anfitrión en la primera línea, que se bloquea cuando se llama a app.address().port.

El problema es la naturaleza potencialmente asincrónica de .listen(). Realmente debería estar haciendo esa llamada console.log dentro de una devolución de llamada pasada para escuchar. Cuando agrega el host, intenta hacer una búsqueda de DNS, que es asincrónica. Entonces, cuando esa línea intenta recuperar la dirección, todavía no hay una porque la solicitud DNS se está ejecutando, por lo que se bloquea.

Prueba esto:

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

Gracias, comenté el console.log ... la advertencia asíncrona simplemente no se me ocurrió, ¡salud! – nak

21

que está sufriendo este problema, ya que está tratando de consolar app.address log() antes de que se haya realizado la conexión. Solo debe asegurarse de registrar la consola después de realizar la conexión, es decir, en una devolución de llamada o después de un evento que indique que la conexión se ha realizado.

Afortunadamente, el evento 'escuchar' es emitida por el servidor después de que se realiza la conexión por lo que acaba de hacer esto:

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

Esto funciona muy bien en nodejs v0.6 + y + v3.0 expreso.

Cuestiones relacionadas