Aplicativo Node.js / Express.js funciona apenas na porta 3000

96

Tenho um aplicativo Node.js / Express.js em execução no meu servidor que só funciona na porta 3000 e estou tentando descobrir por quê. Aqui está o que descobri:

  • Sem especificar uma porta ( app.listen()), o aplicativo é executado, mas a página da web não carrega.
  • Na porta 3001 ( app.listen(3001)) ou em qualquer outra porta que não esteja em uso, o aplicativo é executado, mas a página da web não carrega.
  • Na porta 2999, o aplicativo gera um erro porque outra coisa está usando essa porta.
  • Na porta 3000, o aplicativo é executado e a página da web carrega bem.

Eu sei que o padrão dos aplicativos Express é a porta 3000. Mas, estranhamente, meu aplicativo só é executado quando eu explicitamente o faço rodar na porta 3000 ( app.listen(3000)).

Encontrei isso na linha 220 de /usr/bin/express:

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

O que está fazendo como afirmado anteriormente: configurando a porta para o que está especificado ou para 3000 se nada for especificado.

Como posso fazer meu aplicativo funcionar em uma porta diferente, como 8080 ou 3001?

Obrigado!

Editar: amostra de código (Nó muito simples / aplicativo expresso)

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);
Benjamin Martin
fonte
1) A porté exigido por .listen(), então você não deve tentar ficar sem. 2) Você está recebendo algum erro ao executar o aplicativo? Ou apenas parece inacessível de um navegador? 3) Você está tentando acessar o site na mesma máquina com localhost:3000, localhost:3001etc.? Se estiver usando duas máquinas, um cliente e um servidor, você precisará adicionar exceções ao firewall no servidor para permitir que o Node receba solicitações do cliente.
Jonathan Lonowski
Como você está lançando o aplicativo?
dia
Alguma chance de você colocar uma versão limpa / higienizada em uma essência?
dia
@Jonathan É bom saber sobre .listen(). Acima, quando eu digo "o aplicativo é executado", isso é o mesmo que você dizendo, "sem erros ao executar o aplicativo". Quando digo "a página da web não carrega", é o mesmo que dizer "inacessível de um navegador". Todos os acessos na mesma máquina (meu servidor). Obrigado pelo feedback.
Benjamin Martin
1
@deitch estou usando $ supervisor app.jsou $ PORT=[PORT] node app.jsquando desejo definir a variável da porta de ambiente. Vou colocar uma amostra de código.
Benjamin Martin

Respostas:

117

O seguinte funciona se você tiver algo assim em seu app.js:

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

Codifique explicitamente seu código para usar a porta desejada, como:

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

Este código significa definir sua porta para a variável de ambiente PORTou, se for esse o caso undefined, defina-a como literal 3000.

Ou use seu ambiente para definir a porta. Configurá-lo por meio do ambiente é usado para ajudar a delinear entre PRODUCTIONe DEVELOPMENTtambém muitas plataformas como um serviço usam o ambiente para definir a porta de acordo com suas especificações, bem como configurações Express internas. O seguinte define um par chave = valor de ambiente e, em seguida, inicia seu aplicativo.

$ PORT=8080 node app.js

Em referência ao seu exemplo de código, você quer algo assim:

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
fonte
2
Isso é muito estranho. Fiz o seguinte: 1. Coloquei o app.set()código dentro do meu aplicativo e alterei 3000 para 8080. Ainda só funciona no app.listen(3000). 2. Altere a variável da porta de ambiente para 8080 ao executar o aplicativo de nó. Ainda só funciona app.listen(3000). 3. Foi para / usr / bin / express (linha 220) e mudou 3000 para 8080. Ainda só funciona no app.listen(3000). Obrigado pela postagem informativa. Há algo que preciso reiniciar? O Express não pode ser reiniciado pelo que posso dizer e a reinicialização do aplicativo Node acontece toda vez que eu usonode app.js.
Benjamin Martin
@BenjaminMartin Express é apenas um módulo como qualquer outro módulo, então apenas um simples node app.jsirá iniciá-lo (eu pessoalmente uso nodemonao desenvolver e testar. O que você pode estar pensando é o expressexecutável de linha de comando que é um processo auxiliar que constrói seu esqueleto estrutura do arquivo. Você pode postar um resumo do seu código?
EhevuTov
Peguei vocês. Eu normalmente só uso nodemonem conjunto com nohuppara manter meu aplicativo em execução indefinidamente. Não estou usando a versão executável CL do, expressportanto, ele deve ser reiniciado toda vez que eu reiniciar meu nodeaplicativo. Veja minha postagem original para uma edição com código. Obrigado!
Benjamin Martin
@BenjaminMartin verifique o final da minha resposta e execute o código. Isso deve funcionar muito bem. Acabei de testar na minha máquina.
EhevuTov
Esta é outra maneira útil de alterar a porta, mas ainda funciona apenas quando a porta é 3000. Estou começando a me perguntar se há algo no meu servidor que permite que o conteúdo seja servido apenas em determinadas portas. Não tenho ideia de onde esta configuração estaria localizada. Isso poderia ser um problema? Para sua informação, estou executando o Ubuntu 10.04.
Benjamin Martin
31

Em bin/www, há uma linha:

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

Tente modificá-lo.

Larry Lu
fonte
1
Tentei definir a porta em app.js, mas esta linha estava substituindo. Este é o local correto para trocar a porta.
Neil
12

Tente isto

$ PORT=8080 node app.js
John Williams
fonte
1
Obrigado pela resposta - isso só funciona se eu tiver app.listen (3000) definido dentro de app.js. Em outras palavras, configurar a porta quando executo o aplicativo como você fez não parece substituir app.listen ().
Benjamin Martin
Perfeito. Eu uso é com expresso: PORT = 8000 npm start. Então você pode usar o que quiser: D.
Johan Hoeksma
10

Consulte este link.

Tente localizar a posição bin> www e tente alterar o número da porta ...

Abhishek Gautam
fonte
9

A maneira padrão de alterar a porta de escuta no The Express framework é modificar o arquivo chamado www na pasta bin.

Lá, você encontrará uma linha como a seguinte

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

Altere o valor 3000 para qualquer porta que desejar.

Isso é válido para Express versão 4.13.1

AliAvci
fonte
4

Apenas uma observação para usuários de Mac OS X e Linux:

Se você deseja executar seu aplicativo Node / Express em um número de porta inferior a 1024, você deve executar como superusuário: sudo PORT=80 node app.js

user3711307
fonte
2
A melhor opção para executar seu aplicativo em uma porta abaixo de 1024 é encaminhar uma porta com um número maior. Usar sudo para poder acessar um número de porta menor que 1024 é geralmente considerado uma prática ruim.
Pieter VDE
4

Na última versão do código com express-generator (4.13.1) app.js é um módulo exportado e o servidor é iniciado em / bin / www usando app.set ('port', process.env.PORT || 3001) em app.js será substituído por uma instrução semelhante em bin / www. Acabei de alterar a declaração em bin / www.

usuário1276682
fonte
2

Percebi que isso nunca foi resolvido ... Você provavelmente tem um firewall na frente da sua máquina bloqueando essas portas, ou o iptables está configurado para impedir o uso dessas portas.

Tente executar o nmap -F localhost ao executar seu aplicativo (instale o nmap se não o tiver). Se parecer que você está executando o aplicativo na porta correta e não pode acessá-lo por meio de um navegador remoto, há algum middleware ou firewall físico que está bloqueando a porta.

Espero que isto ajude!

user2855232
fonte
Isso é o que funcionou para mim. Esqueci de permitir a porta.
lalilulelost
2

A linha que você encontrou apenas procura a variável de ambiente PORT, se estiver definida ela a usa, caso contrário, usa a porta padrão 3000. Você tem que definir esta variável ambiental primeiro (não precisa ser root)

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

Se você quiser mostrar algo, você está conectado em 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 seja útil para você

MEAbid
fonte
1

Responder de acordo com a versão atual do expresso

Se você falar sobre a versão atual do express , se você executar app.listen()para começar a escutar sem especificar a porta, o Express escolherá uma porta aleatória para o seu aplicativo, para descobrir qual porta está sendo usada no momento

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

deve produzir a porta do seu app. Além disso, esse primeiro parâmetro 0pode ser totalmente ignorado, mas não é recomendado

Syed Huzaifa Hassan
fonte
0

Certifique-se de estar executando a partir dessa pasta do seu aplicativo, onde você tem o package.json.

Shreeparna Sarkar
fonte
0

Estou usando o minimistpacote e os argumentos de inicialização do nó para controlar a porta.

node server.js --port 4000

ou

node server.js -p 4000

Dentro do server.js, a porta pode ser determinada por

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

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

//....listen(port);

e o padrão é 3000 se nenhuma porta for passada como argumento.

Você pode então usar listen na portvariável.

Williamli
fonte
0

Em app.js, basta adicionar ...

process.env.PORT=2999;

Isso isolará a variável PORT para o aplicativo expresso.

Mark Longmire
fonte
0

Acho que a melhor maneira é usar o pacote dotenv e definir a porta no .envarquivo de configuração sem modificar o arquivo wwwdentro da pasta bin.

Basta instalar o pacote com o comando:

npm install dotenv

solicite em seu aplicativo:

require('dotenv').config()

Crie um arquivo .env no diretório raiz do seu projeto e adicione a porta nele (por exemplo) para ouvir na porta 5000

PORT=5000

e é isso.

Mais informações aqui

huckbit
fonte
0

Se você estiver usando o Nodemon, meu palpite é que a PORT 3000 está definida no nodemonConfig. Verifique se é esse o caso.

Samuel Adranyi
fonte