Comment définir le port pour express sans avoir besoin de coder en dur ni même de choisir le port vous-même? C’est la question que j’avais quand je débutais dans node and express (je suis encore débutant, j’ai beaucoup de choses à apprendre). Les choses que je voulais savoir autre que celles incluses,
app.set('port', portNum)
et utilisant directement le numéro de port dans app.listen(portNum)
?Souvent, vous déploierez votre application auprès d'un fournisseur d'hébergement tel que Heroku . Selon la configuration de l'hôte, le système définira de manière dynamique une variable d'environnement et votre application devra obtenir le port de cette variable. Par exemple, le fournisseur d'hébergement peut exécuter une commande comme celle-ci lorsqu'il exécute votre application:
$ PORT=1234 npm start
... et dans votre code, vous pouvez accéder à cette variable comme ceci:
const port = process.env.PORT;
app.listen(port);
Astuce: La plupart des fournisseurs d’hébergement vous permettent également de définir des variables d’environnement personnalisées. Vous pouvez tester cela localement en créant des variables arbitraires comme ceci:
$ FOO=bar [email protected] npm start
... et accédez à ces variables depuis le code comme ceci:
const foo = process.env.FOO; //-> "bar" const adminEmail = process.env.ADMIN_EMAIL; //-> "[email protected]"
Utiliser une bibliothèque de configuration comme celle-ci vous permet d’avoir des options de configuration spécifiques à l’environnement. Votre structure de dossier ressemblerait à ceci (notez les noms des fichiers):
|- config
|- default.json
|- testing.json
|- production.json
|- src
|- app.js
Vous définissez ensuite vos variables "par défaut" et vos variables spécifiques à l'environnement:
default.json
{
"port": "3030",
"adminEmail": "[email protected]"
}
testing.json
{
"port": "5555"
}
production.json
{
"adminEmail": "[email protected]"
}
La bibliothèque de configuration utilisera toujours les variables par défaut. Lorsque vous êtes sur test, il utilisera l'adresse électronique par défaut de l'administrateur et un autre port. Lorsque vous êtes sur production, il utilisera le port par défaut, mais une adresse électronique différente. Voici comment vous définissez votre "environnement de noeud" (notez que nous utilisons le même nom que les fichiers de configuration JSON):
$ NODE_ENV=testing npm start
$ NODE_ENV=production npm start
Astuce: Vos fichiers de configuration peuvent également faire référence à des variables d’environnement! En reprenant notre exemple de l’option 1 ci-dessus, vous pouvez définir votre configuration de production comme suit:
production.json
{ "port": "PORT" }
La bibliothèque de configuration recherchera toutes les variables d'environnement nommées "PORT" et utilisera cette valeur. En fin de compte, votre dernière commande pour exécuter votre application pourrait ressembler à ceci:
$ NODE_ENV=production PORT=47861 npm start
app.set('port', portNum)
et utiliser directement le numéro de port dans app.listen(portNum)
?Express vous permet de définir des variables d'application à l'aide de app.set
- mais il ne s'agit que d'une manière élégante de définir des variables. Vous pouvez obtenir plus tard les valeurs de ces variables en utilisant app.get
.
Tôt ou tard, vous devrez demander à votre application d'écouter le trafic sur un port spécifique. Vous pouvez faire quelque chose comme ça:
const app = express();
app.set('port', process.env.PORT);
app.use((req, res) => { ... });
app.listen(app.get('port'));
J'ai découvert que vous pouvez utiliser le nombre 0
dansapp.listen()
pour permettre à Express de sélectionner le port au hasard, puis j'ai vite constaté que j'avais maintenant un problème. Je ne savais pas à quel port accéder si mon serveur était connecté. courait ou pas. La réponse si simple à cela a été de sortir la app.address().port
dans la console Afin qu'un serveur express simple ressemble à ceci
let http = require('http');
let express = require('express');
let app = express();
app.use('/', serveStatic('./public'));
app.get('/', (req, res) => {res.render('index')});
let server = http.createServer(app);
server.listen(0, () => {
console.log(server.address().port)
})
Dans mon expérience/connaissance (honnêtement, c'est presque équivalent à zéro), j'en suis venu à croire que, app.set()
définit la propriété dans app.locals et permet de récupérer cette information plus tard (ce qui est un peu similaire à la création d'une variable), mais j'ai lu récemment app.set()
permet à la valeur stockée d’être utilisée dans votre moteur de gabarit et d’autres emplacements, ce qui la rend très différente.
Quelle est la différence entre définir une propriété sur app.locals et appeler app.set ()?
Pour une seule exécution (à partir de l'invite du shell unix):
$ PORT = 1234 node app.js Plus en permanence:
$ export PORT = 1234 $ node app.js Sous Windows:
définir PORT = 1234 Dans Windows PowerShell:
$ env: PORT = 1234
let config = {};
// PORTS
config.port = {};
config.port.alpha = 4050; // Server 1
config.port.beta = 4051; // Server 2
.....
module.exports = config;
const express = require("express"),
config = require("./config");
....
app.set('port',config.port[process.env.SERVER_NAME]);
app.listen(app.get('port'),function(){
console.log("Server running at "+app.get('port'));
});
SERVER_NAME=alpha node app.js
SERVER_NAME=beta node app.js