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

96

J'ai une application Node.js / Express.js en cours d'exécution 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 renvoie une erreur car quelque chose d'autre 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 fonctionne que lorsque je la fais explicitement fonctionner sur le port 3000 ( app.listen(3000)).

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

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

Ce qui fait comme indiqué précédemment: définir 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!

Edit: 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);
Benjamin Martin
la source
1) A portest requis par .listen(), vous ne devriez donc pas essayer de vous en passer. 2) Avez-vous des erreurs lors de l'exécution de l'application? Ou cela semble-t-il simplement inaccessible depuis un navigateur? 3) Vous essayez d'accéder au site Web sur la même machine avec localhost:3000, localhost:3001etc.? 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 demandes du client.
Jonathan Lonowski
Comment lancez-vous l'application?
deitch
Une chance que vous puissiez mettre une version nettoyée / désinfectée dans l'essentiel?
deitch
@Jonathan C'est bon à savoir .listen(). Ci-dessus, quand je dis «l'application s'exécute», c'est la même chose que vous dites «aucune erreur lors de l'exécution de l'application». Quand je dis «la page Web ne se charge pas», c'est la même chose que vous dites «inaccessible depuis un navigateur». Tous les accès depuis la même machine (mon serveur). Merci pour les commentaires.
Benjamin Martin
1
@deitch que j'utilise $ supervisor app.jsou $ PORT=[PORT] node app.jslorsque je veux définir la variable de port d'environnement. Je vais mettre en place un exemple de code.
Benjamin Martin

Réponses:

117

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 vous codez explicitement votre code pour utiliser le port que vous souhaitez, comme:

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

Ce code signifie définir votre port sur la variable d'environnement PORTou, si c'est le cas, undefineddéfinissez-le sur le littéral 3000.

Ou utilisez votre environnement pour définir le port. Le définir via l'environnement est utilisé pour aider à délimiter entre PRODUCTIONet de DEVELOPMENTnombreuses plates-formes en tant que service utilisent l'environnement pour définir le port en fonction de leurs spécifications ainsi que des configurations Express internes. 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 voulez 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'));
EhevuTov
la source
2
C'est vraiment bizarre. J'ai fait ce qui suit: 1. Mettez le app.set()code dans mon application et changé 3000 en 8080. Ne fonctionne toujours que sur app.listen(3000). 2. Modifiez la variable de port d'environnement sur 8080 lors de l'exécution de l'application de nœud. Ne fonctionne toujours que sur app.listen(3000). 3. Passé à / usr / bin / express (ligne 220) et changé 3000 en 8080. Ne fonctionne toujours que sur app.listen(3000). Merci pour le message informatif. Dois-je redémarrer quelque chose? Express ne peut pas être redémarré à partir de ce que je peux dire et le redémarrage de l'application Node se produit à chaque fois que j'utilisenode app.js.
Benjamin Martin
@BenjaminMartin Express est juste un module comme n'importe quel autre module, donc juste un simple node app.jsle démarrera (je l'utilise personnellement nodemonlors du développement et des tests. Ce à quoi vous pensez peut-être est l' expressexécutable de ligne de commande qui est un processus d'aide qui construit votre squelette structure du fichier. Pouvez-vous publier un aperçu de votre code?
EhevuTov
je t'ai eu. Je n'utilise généralement qu'en nodemonconjonction avec nohuppour que mon application continue de fonctionner indéfiniment. Je n'utilise pas la version exécutable CL de express, elle doit donc redémarrer chaque fois que je redémarre mon nodeapplication. Voir mon message d'origine pour une modification avec le code. Merci!
Benjamin Martin
@BenjaminMartin vérifie le bas de ma réponse et exécute ce code. Cela devrait très bien fonctionner. Je viens de le tester sur ma machine.
EhevuTov
C'est un autre moyen utile de changer le port, mais cela ne fonctionne toujours que lorsque le port est à 3000. Je commence à me demander s'il y a quelque chose sur mon serveur qui permet uniquement au contenu d'être servi sur certains ports. Cependant, je n'ai aucune idée de l'emplacement de cette configuration. Cela pourrait-il être un problème? Pour info, j'utilise Ubuntu 10.04.
Benjamin Martin
31

Dans bin/www, il y a une ligne:

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

Essayez de le modifier.

Larry Lu
la source
1
J'ai essayé de définir le port dans app.js mais cette ligne était prioritaire. C'est le bon endroit pour changer de port.
Neil
12

Essaye ça

$ PORT=8080 node app.js
John Williams
la source
1
Merci pour la réponse - cela ne fonctionne que si app.listen (3000) est 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 ().
Benjamin Martin
Parfait. J'utilise avec express: PORT = 8000 npm start. Vous pouvez donc utiliser ce que vous voulez: D.
Johan Hoeksma
10

Reportez-vous à ce lien.

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

Abhishek Gautam
la source
9

La manière par défaut de 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 telle que la suivante

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

Changez la valeur 3000 pour n'importe quel port que vous souhaitez.

Ceci est valable pour la version 4.13.1 Express

AliAvci
la source
4

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 en tant que superutilisateur: sudo PORT=80 node app.js

user3711307
la source
2
Une meilleure option pour exécuter votre application sur un port inférieur à 1024 consiste à transférer un port avec un plus grand nombre. L'utilisation de sudo pour pouvoir accéder à un numéro de port inférieur à 1024 est généralement considérée comme une mauvaise pratique.
Pieter VDE
4

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

user1276682
la source
2

Vous avez remarqué 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, il y a un middleware ou un pare-feu physique qui bloque le port.

J'espère que cela t'aides!

user2855232
la source
C'est ce qui a fonctionné pour moi. J'ai oublié d'autoriser le port.
lalilulelost
2

La ligne que vous avez trouvée recherche simplement 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 d'environnement (pas besoin d'être root)

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

Si vous voulez montrer quelque chose que 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

MEAbid
la source
1

Réponse selon la version actuelle d'Express

Si vous parlez de la version actuelle d'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 quel port il est actuellement utilisé

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

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

Syed Huzaifa Hassan
la source
0

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

Shreeparna Sarkar
la source
0

J'utilise le minimistpackage 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);

et il vaut 3000 par défaut si aucun port n'est passé en argument.

Vous pouvez ensuite utiliser listen sur la portvariable.

Williamli
la source
0

Dans app.js, ajoutez simplement ...

process.env.PORT=2999;

Cela isolera la variable PORT de l'application express.

Mark Longmire
la source
0

Je pense que le meilleur moyen est d'utiliser le package dotenv et de définir le port sur le .envfichier de configuration sans modifier le fichier wwwà l'intérieur du dossier bin.

Installez simplement le package avec la commande:

npm install dotenv

l'exiger sur votre application:

require('dotenv').config()

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

PORT=5000

et c'est tout.

Plus d'infos ici

huckbit
la source
0

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

Samuel Adranyi
la source