113 votes

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

J'ai une application Node.js/Express.js exécutée 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 tout autre port qui n'est pas utilisé, l'application s'exécute mais la page web ne se charge pas.
  • Sur le port 2999, l'application lance une erreur car autre chose 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 sont configurées par défaut sur le port 3000. Mais étrangement, mon application ne fonctionne que lorsque je la lance explicitement 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);

Cela fait comme précédemment mentionné : définir le port sur ce qui est spécifié ou sur 3000 s'il n'y a rien de spécifié.

Comment pourrais-je faire fonctionner mon application sur un port différent comme 8080 ou 3001 ?

Merci !

Modification : Exemple de Code (Application Node/Express très simple)

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

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

// Ne fonctionne que sur 3000 quel que soit le port environnemental défini ou la façon dont je définis [valeur] dans app.set('port', [valeur]).
app.listen(3000);

0 votes

1) Un port est requis par .listen(), donc vous ne devriez pas essayer de vous en passer. 2) Rencontrez-vous des erreurs lorsque vous exécutez l'application? Ou semble-t-elle tout simplement inaccessible depuis un navigateur? 3) Essayez-vous d'accéder au site sur le même machine avec localhost:3000, localhost:3001, etc.? Si vous utilisez deux machines, un client et un serveur, vous devrez ajouter des exceptions au pare-feu sur le serveur pour permettre à Node de recevoir des requêtes du client.

0 votes

Comment lancez-vous l'application ?

0 votes

Y a-t-il une chance que vous puissiez mettre en ligne une version épurée/sanitisée dans un gist?

136voto

EhevuTov Points 6010

Le code suivant fonctionne si vous avez quelque chose comme ceci dans votre app.js :

http.createServer(app).listen(app.get('port'),
  function(){
    console.log("Le serveur Express écoute sur le port " + app.get('port'));
});

Soit vous encodez explicitement votre code pour utiliser le port désiré, comme ceci :

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

Ce code signifie définir votre port sur la variable d'environnement PORT ou, si non définie, le définir sur le littéral 3000.

Ou, utilisez votre environnement pour définir le port. Le définir via l'environnement est utilisé pour distinguer entre PRODUCTION et DEVELOPMENT et de nombreuses Plateformes en tant que Service utilisent l'environnement pour définir le port selon leurs spécifications ainsi que les configurations internes d'Express. Le code suivant définit une paire clef=valeur pour l'environnement puis lance votre application.

$ PORT=8080 node app.js

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

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

// définit le port 8080 par défaut ou sauf indication contraire dans l'environnement
app.set('port', process.env.PORT || 8080);

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

// Fonctionne uniquement sur le port 3000 peu importe comment je définis le port environnement ou avec quel [valeur] dans app.set('port', [valeur]).
// app.listen(3000);
app.listen(app.get('port'));

2 votes

C'est vraiment bizarre. J'ai fait ce qui suit : 1. Mis le code app.set() à l'intérieur de mon application et changé 3000 en 8080. Ça marche toujours seulement sur app.listen(3000). 2. Changé la variable du port de l'environnement en 8080 lorsque je lance l'application node. Ça marche toujours seulement sur app.listen(3000). 3. Suis allé à /usr/bin/express (ligne 220) et changé 3000 en 8080. Ça marche toujours seulement sur app.listen(3000). Merci pour le post informatif cependant. Est-ce qu'il y a quelque chose que je dois redémarrer? Express ne peut pas être redémarré d'après ce que je peux voir et redémarrer l'application Node se produit chaque fois que j'utilise node app.js.

0 votes

@BenjaminMartin Express n'est qu'un module comme n'importe quel autre module, donc un simple node app.js le démarrera (personnellement, j'utilise nodemon lorsque je développe et teste). Ce que vous pourriez penser, c'est de la commande exécutable en ligne de commande express qui est un processus auxiliaire qui construit la structure de vos fichiers squelette. Pouvez-vous poster un gist de votre code?

0 votes

Gotcha. Je n'utilise généralement que nodemon en conjonction avec nohup pour maintenir mon application en cours d'exécution indéfiniment. Je n'utilise pas la version exécutable en ligne de commande d'express donc elle doit redémarrer à chaque fois que je redémarre mon application node. Consultez mon post original pour une modification avec du code. Merci!

35voto

Larry Lu Points 589

Dans bin/www, il y a une ligne :

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

Essayez de le modifier.

1 votes

J'ai essayé de définir le port dans app.js mais cette ligne avait la priorité. C'est ici l'endroit correct pour changer le port.

14voto

John Williams Points 769

Essayez ceci

$ PORT=8080 node app.js

1 votes

Merci pour la réponse - cela fonctionne uniquement si j'ai app.listen(3000) défini dans app.js. En d'autres termes, définir le port lorsque j'exécute l'application comme vous l'avez fait ne semble pas remplacer app.listen().

0 votes

Parfait. Je l'utilise avec express: PORT=8000 npm start. Donc tu peux utiliser ce que tu veux :D.

13voto

Abhishek Gautam Points 305

Se référer à ce lien.

Essayez de localiser l'emplacement bin>www et essayez de changer le numéro de port...

11voto

AliAvci Points 692

La façon par défaut de changer le port d'écoute sur le framework Express est de modifier le fichier nommé www dans le dossier bin.

Vous y trouverez une ligne semblable à la suivante

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

Changez la valeur 3000 par le port de votre choix.

Ceci est valable pour la version 4.13.1 d'Express

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X