Qu'est-ce que NODE_ENV et comment l'utiliser dans Express?

184

Ceci est mon application, je suis actuellement en production.

var app = express();
app.set('views',settings.c.WEB_PATH + '/public/templates');
app.set('view engine','ejs');
app.configure(function(){
    app.use(express.favicon());
    app.use(express.static(settings.c.WEB_PATH + '/public'));
    app.use(express.bodyParser());
    app.use(express.cookieParser());
    app.use(express.methodOverride());
    app.use(express.session({
            cookie:{ domain:"."+settings.c.SITE_DOMAIN, maxAge:1440009999},
            secret:'hamster',
            store: r_store,
            }));
    app.use(useragent.express());
    app.use(flash());
    app.use(passport.initialize());
    app.use(passport.session());
});

Cependant, j'ai appris à le connaître NODE_ENVet je veux l'utiliser. Comment puis-je faire ceci?

TIMEX
la source
Dans votre cas, je suppose que ce que vous pouvez utiliser est app.configure('development', ...)ou "production" pour définir certains paramètres uniquement pour les environnements de développement ou de production. Voir expressjs.com/api.html#app.configure
Andreas Hultgren

Réponses:

360

NODE_ENVest une variable d'environnement rendue populaire par le framework de serveur Web express . Lorsqu'une application de nœud est exécutée, elle peut vérifier la valeur de la variable d'environnement et faire différentes choses en fonction de la valeur. NODE_ENVspécifiquement est utilisé (par convention) pour indiquer si un environnement particulier est un environnement de production ou de développement . Un cas d'utilisation courant est l'exécution d'un code de débogage ou de journalisation supplémentaire s'il est exécuté dans un environnement de développement.

Accéder à NODE_ENV

Vous pouvez utiliser le code suivant pour accéder vous-même à la variable d'environnement afin de pouvoir effectuer vos propres vérifications et logique:

var environment = process.env.NODE_ENV

Ou bien en utilisant express ' app.get('env')( note: par défaut "development")

Sachez que si vous ne l'avez pas défini explicitement NODE_ENVpour votre environnement, il le sera undefined.

Définition de NODE_ENV

La manière de définir réellement la variable d'environnement varie d'un système d'exploitation à l'autre et dépend également de la configuration de l'utilisateur.

Si vous souhaitez définir la variable d'environnement comme une variable unique, vous pouvez le faire à partir de la ligne de commande:

  • linux et mac :export NODE_ENV=production
  • fenêtres :$env:NODE_ENV = 'production'

À long terme, vous devriez persister afin qu'il ne se désactive pas si vous redémarrez - plutôt que de lister toutes les méthodes possibles pour le faire, je vous laisse chercher comment le faire vous-même!

La convention a dicté qu'il n'y a que deux valeurs que vous devez utiliser pour NODE_ENV, soit productionou development, toutes les minuscules. Rien ne vous empêche d'ajouter plus de valeurs, mais ce n'est probablement pas une bonne idée, car je vois beaucoup de ce type de code dans la plupart des node_modules que j'utilise:

var development = process.env.NODE_ENV !== 'production';

Notez que c'est une très mauvaise idée d'essayer de mettre NODE_ENVde l' intérieur d' une application nœud lui - même - si vous le faites il ne s'appliquera au processus à partir duquel il a été mis , donc les choses ne fonctionneront probablement pas comme vous les attendre à. Ne le faites pas, vous le regretterez.

Ed Hinchliffe
la source
5
Dans Express 4, app.configure()a été supprimé. Le guide de migration Express 4 recommande «d'utiliser process.env.NODE_ENVou app.get('env')de détecter l'environnement et de configurer l'application en conséquence».
Chris Bartley
3
Je pense qu'il est préférable d'utiliser app.get ('env') car si l'environnement est indéfini, le nœud est par défaut dev, alors que le simple fait de vérifier la variable vous-même donne undefined
light24bulbs
11
Bon point - j'ai ajouté une note pour mettre en évidence la valeur par défaut. Cependant, mon sentiment personnel est que vous ne devriez pas utiliser app.get('env')précisément pour cette raison. Cela dissimule que cette variable importante n'est pas définie - ce qui rend les choses incohérentes lorsque vous y accédez de l'extérieur d'express. De plus, je pense qu'il est moins dangereux que le code de débogage ne s'exécute pas accidentellement sur un environnement de développement que de le faire fonctionner accidentellement sur un environnement de production.
Ed Hinchliffe
5
J'ai mesuré les effets de l'omission du paramètre NODE_ENV dans les applications express. Par défaut, developmentcela signifie, entre autres, que les modèles seront retraités pour chaque demande. La conséquence est un gain ou une perte de performances d'environ 75% entre la production et le développement lors de l'utilisation de Jade. J'ai également créé un article de blog sur apmblog.dynatrace.com/2015/07/22/…
DanielKhan
8
Je pense que pour les projets express, en plus de la "production" et du "développement", il faut au moins un autre "test" pour exécuter les tests automatisés. Vous souhaiterez peut-être utiliser un autre DB pour les données de test renseignées.
dawnstar
19

NODE_ENV est une variable d'environnement qui signifie environnement de nœud dans un serveur express.

C'est ainsi que nous définissons et détectons l'environnement dans lequel nous nous trouvons.

Il est très courant d'utiliser productionet development.

Ensemble:

export NODE_ENV=production

Avoir:

Vous pouvez l'obtenir en utilisant app.get('env')

Alireza
la source
11

Je suppose que la question originale comprenait comment Express utilise cette variable d'environnement.

Express utilise NODE_ENV pour modifier son propre comportement par défaut. Par exemple, en mode développement, le gestionnaire d'erreurs par défaut renverra une trace de pile au navigateur. En mode production, la réponse est simplement Internal Server Errord'éviter de divulguer les détails d'implémentation au monde.

Randy Hudson
la source
0

En règle générale, vous utilisez la NODE_ENVvariable pour effectuer des actions spéciales lorsque vous développez, testez et déboguez votre code. Par exemple, pour produire une journalisation détaillée et une sortie de débogage dont vous ne voulez pas en production. Express lui-même se comporte différemment selon qu'il NODE_ENVest défini sur productionou non. Vous pouvez voir cela si vous placez ces lignes dans une application Express, puis faites une requête HTTP GET à /error:

app.get('/error', function(req, res) {
  if ('production' !== app.get('env')) {
    console.log("Forcing an error!");
  }
  throw new Error('TestError');
});

app.use(function (req, res, next) {
  res.status(501).send("Error!")
})

Notez que ce dernier app.use()doit être le dernier, après tous les autres gestionnaires de méthodes!

Si vous définissez NODE_ENVsur productionavant de démarrer votre serveur, puis que vous lui envoyez une GET /errorrequête, vous ne devriez pas voir le texte Forcing an error!dans la console et la réponse ne doit pas contenir de trace de pile dans le corps HTML (qui provient d'Express). Si, à la place, vous définissez NODE_ENVautre chose avant de démarrer votre serveur, le contraire devrait se produire.

Sous Linux, définissez la variable d'environnement NODE_ENV comme ceci:

export NODE_ENV = ' valeur '

Rêne
la source