La aplicación Node.js / Express.js solo funciona en el puerto 3000

96

Tengo una aplicación Node.js / Express.js ejecutándose en mi servidor que solo funciona en el puerto 3000 y estoy tratando de averiguar por qué. Esto es lo que encontré:

  • Sin especificar un puerto ( app.listen()), la aplicación se ejecuta pero la página web no se carga.
  • En el puerto 3001 ( app.listen(3001)) o cualquier otro puerto que no esté en uso, la aplicación se ejecuta pero la página web no se carga.
  • En el puerto 2999, la aplicación arroja un error porque otra cosa está usando ese puerto.
  • En el puerto 3000, la aplicación se ejecuta y la página web se carga correctamente.

Sé que las aplicaciones Express están predeterminadas en el puerto 3000. Pero, curiosamente, mi aplicación solo se ejecuta cuando hago que se ejecute explícitamente en el puerto 3000 ( app.listen(3000)).

Encontré esto en la línea 220 de /usr/bin/express:

app.set(\'port\', process.env.PORT || 3000);

Lo que está haciendo como se indicó anteriormente: configurar el puerto en lo que se especifica o en 3000 si no se especifica nada.

¿Cómo puedo hacer que mi aplicación funcione en un puerto diferente, como 8080 o 3001?

¡Gracias!

Editar: Ejemplo de código (aplicación Node / Express muy simple)

var express = require("express");
var app = express();

app.get('/', function(req, res){
    res.send('hello world'); 
});

// Only works on 3000 regardless of what I set environment port to or how I set [value] in app.set('port', [value]).
app.listen(3000);
Benjamín Martín
fuente
1) Se portrequiere A .listen(), por lo que no debería intentar prescindir. 2) ¿Está recibiendo algún error al ejecutar la aplicación? ¿O simplemente parece inaccesible desde un navegador? 3) ¿Está intentando acceder a la página web en la misma máquina con localhost:3000, localhost:3001, etc.? Si está utilizando dos máquinas, un cliente y un servidor, deberá agregar excepciones al firewall en el servidor para permitir que Node reciba solicitudes del cliente.
Jonathan Lonowski
¿Cómo inicias la aplicación?
deitch
¿Alguna posibilidad de que pueda poner una versión limpia / desinfectada en un resumen?
deitch
@Jonathan Es bueno saberlo .listen(). Arriba, cuando digo, "la aplicación se ejecuta", es lo mismo que dices, "no hay errores al ejecutar la aplicación". Cuando digo "la página web no se carga", es lo mismo que usted dice, "inaccesible desde un navegador". Todo el acceso desde la misma máquina (mi servidor). Gracias por la respuesta.
Benjamin Martin
1
@deitch que estoy usando $ supervisor app.jso $ PORT=[PORT] node app.jscuando quiero establecer la variable del puerto de entorno. Pondré una muestra de código.
Benjamin Martin

Respuestas:

117

Lo siguiente funciona si tiene algo como esto en su app.js:

http.createServer(app).listen(app.get('port'),
  function(){
    console.log("Express server listening on port " + app.get('port'));
});

O bien codifique explícitamente su código para usar el puerto que desee, como:

app.set('port', process.env.PORT || 3000);

Este código significa que configure su puerto en la variable de entorno PORTo, si es undefinedasí, configúrelo en el literal 3000.

O utilice su entorno para configurar el puerto. La configuración a través del entorno se utiliza para ayudar a delinear entre PRODUCTIONy DEVELOPMENTtambién muchas plataformas como servicio utilizan el entorno para configurar el puerto de acuerdo con sus especificaciones, así como las configuraciones internas Express. Lo siguiente establece un par de clave = valor de entorno y luego inicia su aplicación.

$ PORT=8080 node app.js

En referencia a su ejemplo de código, quiere algo como esto:

var express = require("express");
var app = express();

// sets port 8080 to default or unless otherwise specified in the environment
app.set('port', process.env.PORT || 8080);

app.get('/', function(req, res){
    res.send('hello world');
});

// Only works on 3000 regardless of what I set environment port to or how I set
// [value] in app.set('port', [value]).
// app.listen(3000);
app.listen(app.get('port'));
EhevuTov
fuente
2
Esto es muy extraño. He hecho lo siguiente: 1. Pongo el app.set()código dentro de mi aplicación y cambié 3000 a 8080. Todavía solo funciona app.listen(3000). 2. Cambie la variable del puerto de entorno a 8080 cuando ejecute la aplicación de nodo. Todavía solo funciona app.listen(3000). 3. Se fue a / usr / bin / express (línea 220) y cambió 3000 a 8080. Todavía solo funciona app.listen(3000). Sin embargo, gracias por la publicación informativa. ¿Hay algo que deba reiniciar? Express no se puede reiniciar por lo que puedo decir y el reinicio de la aplicación Node ocurre cada vez que lo usonode app.js.
Benjamin Martin
@BenjaminMartin Express es solo un módulo como cualquier otro módulo, por lo que solo un simple node app.jslo iniciará (yo personalmente uso nodemoncuando desarrollo y prueba. Lo que podría estar pensando es en el expressejecutable de línea de comandos que es un proceso auxiliar que construye su esqueleto estructura de archivo. ¿Puedes publicar un resumen de tu código?
EhevuTov
te tengo. Por lo general, solo lo uso nodemonjunto con nohuppara mantener mi aplicación ejecutándose indefinidamente. No estoy usando la versión ejecutable de CL, por expresslo que debe reiniciarse cada vez que reinicio mi nodeaplicación. Vea mi publicación original para una edición con código. ¡Gracias!
Benjamin Martin
@BenjaminMartin verifica la parte inferior de mi respuesta y ejecuta ese código. Eso debería funcionar bien. Lo acabo de probar en mi máquina.
EhevuTov
Esta es otra forma útil de cambiar el puerto, pero solo funciona cuando el puerto es 3000. Estoy empezando a preguntarme si hay algo en mi servidor que solo permite que se sirva contenido en ciertos puertos. Sin embargo, no tengo idea de dónde se ubicaría esta configuración. ¿Podría ser esto un problema? Para su información, estoy ejecutando Ubuntu 10.04.
Benjamin Martin
31

En bin/www, hay una línea:

var port = normalizePort(process.env.PORT || '3000');

Intente modificarlo.

Larry Lu
fuente
1
Intenté configurar el puerto en app.js pero esta línea era invalidante. Este es el lugar correcto para cambiar el puerto.
Neil
12

Prueba esto

$ PORT=8080 node app.js
John Williams
fuente
1
Gracias por la respuesta, esto solo funciona si tengo app.listen (3000) configurado dentro de app.js. En otras palabras, configurar el puerto cuando ejecuto la aplicación como lo ha hecho no parece anular app.listen ().
Benjamin Martin
Perfecto. Yo uso es con express: PORT = 8000 npm start. Entonces puedes usar lo que quieras: D.
Johan Hoeksma
10

Consulte este enlace.

Intente ubicar la ubicación bin> www e intente cambiar el número de puerto ...

Abhishek Gautam
fuente
9

La forma predeterminada de cambiar el puerto de escucha en el marco Express es modificar el archivo llamado www en la carpeta bin.

Allí, encontrará una línea como la siguiente

var port = normalizePort(process.env.PORT || '3000');

Cambie el valor 3000 a cualquier puerto que desee.

Esto es válido para Express versión 4.13.1

AliAvci
fuente
4

Solo una nota para los usuarios de Mac OS X y Linux:

Si desea ejecutar su aplicación Node / Express en un número de puerto inferior a 1024, debe ejecutar como superusuario: sudo PORT=80 node app.js

usuario3711307
fuente
2
Una mejor opción para ejecutar su aplicación en un puerto por debajo de 1024 es reenviar un puerto con un número mayor. El uso de sudo para poder acceder a un número de puerto inferior a 1024 generalmente se considera una mala práctica.
Pieter VDE
4

En la última versión del código con express-generator (4.13.1) app.js es un módulo exportado y el servidor se inicia en / bin / www usando app.set ('port', process.env.PORT || 3001) en app.js será anulado por una declaración similar en bin / www. Acabo de cambiar la declaración en bin / www.

usuario1276682
fuente
2

Noté que esto nunca se resolvió ... Es probable que tenga un firewall frente a su máquina que bloquea esos puertos, o iptables está configurado para evitar el uso de esos puertos.

Intente ejecutar nmap -F localhost cuando ejecute su aplicación (instale nmap si no lo tiene). Si parece que está ejecutando la aplicación en el puerto correcto y no puede acceder a ella a través de un navegador remoto, entonces hay algún middleware o un firewall físico que está bloqueando el puerto.

¡Espero que esto ayude!

usuario2855232
fuente
Eso es lo que funcionó para mí. Olvidé permitir el puerto.
lalilulelost
2

La línea que encontró solo busca la variable ambiental PORT, si está definida, la usa, de lo contrario usa el puerto predeterminado 3000. Primero debe definir esta variable de entorno (no es necesario ser root)

export PORT=8080
node <your-app.js>
dinigo
fuente
2

Si quieres mostrar algo, estás conectado en 3000

var express = require('express')
var app = express()

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

app.listen(3000, function () {
  console.log('Example app listening on port 3000!')
})

Espero que te sea de ayuda

MEAbid
fuente
1

Responde según la versión actual de express

Si habla sobre la versión actual de express , si ejecuta app.listen()para comenzar a escuchar sin especificar el puerto, Express elegirá un puerto aleatorio para su aplicación, para averiguar qué puerto se está ejecutando actualmente en uso.

app.listen(0, () => {
    console.log(app.address().port)
}

debería generar el puerto de su app. Además, ese primer parámetro 0se puede ignorar por completo, pero no se recomienda

Syed Huzaifa Hassan
fuente
0

Asegúrese de estar ejecutando desde esa carpeta de su aplicación, donde tiene el package.json.

Shreeparna Sarkar
fuente
0

Estoy usando el minimistpaquete y los argumentos de inicio del nodo para controlar el puerto.

node server.js --port 4000

o

node server.js -p 4000

Dentro de server.js, el puerto se puede determinar mediante

var argv = parseArgs(process.argv.slice(2))

const port = argv.port || argv.p || 3000;
console.log(`Listening on port ${port}...`)

//....listen(port);

y el valor predeterminado es 3000 si no se pasa ningún puerto como argumento.

Luego puede usar listen en la portvariable.

williamli
fuente
0

En app.js, simplemente agregue ...

process.env.PORT=2999;

Esto aislará la variable PORT de la aplicación express.

Mark Longmire
fuente
0

Creo que la mejor manera es usar el paquete dotenv y configurar el puerto en el .envarchivo de configuración sin modificar el archivo wwwdentro de la carpetabin .

Simplemente instale el paquete con el comando:

npm install dotenv

requiera en su aplicación:

require('dotenv').config()

Cree un archivo .env en el directorio raíz de su proyecto y agregue el puerto en él (por ejemplo) para escuchar en el puerto 5000

PORT=5000

y eso es.

Más info aquí

huckbit
fuente
0

Si está utilizando Nodemon, supongo que el PORT 3000 está configurado en nodemonConfig. Compruebe si ese es el caso.

Samuel Adranyi
fuente