web-dev-qa-db-fra.com

L'application Node.js / Express.js fonctionne uniquement sur le port 3000

J'ai une application Node.js/Express.js s'exécutant sur mon serveur qui ne fonctionne que sur le port 3000 et j'essaie de comprendre pourquoi. Voici ce que j'ai trouvé:

  • Sans spécifier de port (app.listen()), l'application s'exécute mais la page Web ne se charge pas.
  • Sur le port 3001 (app.listen(3001)) ou sur tout autre port non utilisé, l'application s'exécute mais la page Web ne se charge pas.
  • Sur le port 2999, l'application génère une erreur car un autre utilisateur utilise ce port.
  • Sur le port 3000, l'application s'exécute et la page Web se charge correctement.

Je sais que les applications Express utilisent par défaut le port 3000. Mais étrangement, mon application ne s'exécute que lorsque je la fais explicitement fonctionner sur le port 3000 (app.listen(3000)).

J'ai trouvé ceci à la ligne 220 de /usr/bin/express:

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

Ce qui se passe comme indiqué précédemment: définissez le port sur ce qui est spécifié ou sur 3000 si rien n'est spécifié.

Comment puis-je faire fonctionner mon application sur un autre port tel que 8080 ou 3001?

Merci!

Édition: Exemple de code (Node très simple/Application Express)

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);
87
Benjamin Martin

Ce qui suit fonctionne si vous avez quelque chose comme ça dans votre app.js:

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

Soit explicitement coder votre code pour utiliser le port que vous voulez, comme:

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

Ce code signifie que vous devez définir votre port sur la variable d'environnement PORT ou, s'il s'agit de undefined, puis sur le littéral 3000.

Ou utilisez votre environnement pour définir le port. Le paramétrage via l’environnement permet de délimiter PRODUCTION et DEVELOPMENT. De nombreuses plates-formes en tant que service utilisent l’environnement pour définir le port en fonction de leurs spécifications ainsi que de la configuration Express interne. Ce qui suit définit une paire clé d’environnement = valeur, puis lance votre application.

$ PORT=8080 node app.js

En référence à votre exemple de code, vous souhaitez quelque chose comme ceci:

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

Dans bin/www, il y a une ligne:

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

Essayez de le modifier.

27
Larry Lu

Essaye ça

$ PORT=8080 node app.js
12
John Williams

La méthode par défaut pour changer le port d'écoute sur le framework Express est de modifier le fichier nommé www dans le dossier bin.

Là, vous trouverez une ligne comme celle-ci

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

Remplacez la valeur 3000 par le port de votre choix.

Ceci est valable pour Express version 4.13.1

9
AliAvci

Refer to this link.

Essayez de localiser le bac> www et essayez de changer le numéro de port ...

9
Abhishek Gautam

Dans la dernière version de code avec express-generator (4.13.1), app.js est un module exporté. Le serveur est démarré dans/bin/www à l'aide de app.set ('port', process.env.PORT || 3001). dans app.js sera remplacé par une déclaration similaire dans bin/www. Je viens de changer la déclaration dans bin/www.

4
user1276682

Juste une note pour les utilisateurs de Mac OS X et Linux:

Si vous souhaitez exécuter votre application Node/Express sur un numéro de port inférieur à 1024, vous devez exécuter le compte en tant que superutilisateur: Sudo PORT=80 node app.js

4
user3711307

Si vous voulez montrer quelque chose, vous êtes connecté sur 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!')
})

J'espère que cela vous sera utile

2
MEAbid

La ligne trouvée ne recherche que la variable d'environnement PORT, si elle est définie, elle l'utilise, sinon utilise le port par défaut 3000. Vous devez d'abord définir cette variable environnementale (pas besoin d'être root)

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

Réponse selon version actuelle de express

Si vous parlez de version actuelle de express , si vous exécutez app.listen() pour commencer à écouter sans spécifier de port, Express choisira un port aléatoire pour votre application, pour savoir sur quel port il est actuellement utilisé

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

devrait sortie le port de votre app. De plus, ce premier paramètre 0 peut être totalement ignoré mais n'est pas recommandé

1

Remarquez que cela n'a jamais été résolu ... Vous avez probablement un pare-feu devant votre machine bloquant ces ports, ou iptables est configuré pour empêcher l'utilisation de ces ports.

Essayez d’exécuter nmap -F localhost lorsque vous exécutez votre application (installez nmap si vous ne l’avez pas). S'il semble que vous exécutez l'application sur le bon port et que vous ne pouvez pas y accéder via un navigateur distant, un middleware ou un pare-feu physique bloque le port.

J'espère que cela t'aides!

1
user2855232

Dans app.js, ajoutez simplement ...

process.env.PORT=2999;

Cela isolera la variable PORT dans l'application express.

1
Mark Longmire

Si vous utilisez Nodemon, je suppose que le port 3000 est défini dans nodemonConfig. Vérifiez si c'est le cas.

0
Samuel Adranyi

Assurez-vous que vous exécutez à partir de ce dossier de votre application, où vous avez le package.json.

0
Shreeparna Sarkar

Je pense que le meilleur moyen est d'utiliser dotenv package et de définir le port sur le fichier de configuration .env sans modifier le fichier www dans le dossier bin.

Il suffit d'installer le paquet avec la commande:

npm install dotenv

l'exiger sur votre demande:

require('dotenv').config()

Créez un fichier .env dans le répertoire racine de votre projet et ajoutez-y le port (par exemple) pour l'écouter sur le port 5000.

PORT=5000

et c'est tout.

Plus d'infos ici

0
huckbit

J'utilise le package minimist et les arguments de démarrage du nœud pour contrôler le port.

node server.js --port 4000

ou

node server.js -p 4000

Dans server.js, le port peut être déterminé par

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

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

//....listen(port);

la valeur par défaut est 3000 si aucun port n'est transmis en tant qu'argument.

Vous pouvez ensuite utiliser listen sur la variable port.

0
williamli