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

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

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.


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

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


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


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


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.


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!


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>

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ê


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


0

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


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.


0

Em app.js, basta adicionar ...

process.env.PORT=2999;

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


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


0

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.