process.env.NODE_ENV n'est pas défini


170

J'essaye de suivre un tutoriel sur NodeJs. Je ne pense pas avoir manqué quoi que ce soit mais chaque fois que j'appelle process.env.NODE_ENVla seule valeur que je récupère, elle n'est pas définie. D'après mes recherches, la valeur par défaut devrait être «développement». Comment cette valeur est-elle définie dynamiquement et où est-elle définie initialement?


pour définir NODE_ENV pour les applications heroku, vous pouvez utiliser:heroku config:set NODE_ENV="production"
Connor Leech

14
Bien que les réponses ci-dessous résolvent temporairement le problème en définissant la variable d'environnement, la plus grande leçon ici devrait être que vous ne pouvez jamais savoir si une variable d'environnement sera définie ... Alors écrivez votre code en conséquence et testez s'il est défini et si oui, à quoi. Ne faites pas d'hypothèses à ce sujet.
Stijn de Witt

Réponses:


193

process.env est une référence à votre environnement, vous devez donc y définir la variable.

Pour définir une variable d'environnement sous Windows :

SET NODE_ENV=development

sous OS X ou Linux :

export NODE_ENV=development

4
vous pouvez ajouter que si NODE_ENV n'est pas défini, l'application se comporte comme en mode "développement"
Rocco

1
Pour Linux, vi ~ / .bash_profile, puis insérez NODE_ENV = development et enregistrez.
stonyau

6
Au cas où quelqu'un d'autre se débat ... il y a une différence entre "SET V = VAL" et "SET V = VAL". Les espaces comptent.
willem

4
Notez que le module "cross-env" permet de faire similaire à ce qui précède, et il fonctionnera à la fois sous OSX et Windows: "cross-env NODE_ENV = development". Vous devez d'abord installer cross-env: "npm install cross-env --save". Ayez cela dans un script dans votre package.json et vous êtes prêt à utiliser les deux plates-formes.
Antonio Brandao

6
Cela n'a pas fonctionné pour moi. J'ai exécuté export NODE_ENV=developmentsur mon terminal Mac avant de faire un react-native run-iosdepuis le même terminal. Lors du débogage, la valeur de process.env.NODE_ENVn'est pas définie.
Ash

58

conseils

dans package.json:

"scripts": {
  "start": "set NODE_ENV=dev && node app.js"
 }

dans app.js:

console.log(process.env.NODE_ENV) // dev
console.log(process.env.NODE_ENV === 'dev') // false
console.log(process.env.NODE_ENV.length) // 4 (including a space at the end) 

alors, cela peut mieux:

"start": "set NODE_ENV=dev&& node app.js"

ou

console.log(process.env.NODE_ENV.trim() === 'dev') // true

2
"start": "set NODE_ENV=dev&& node app.js"
Voici

Excellente observation, console.log(process.env.NODE_ENV.length) // 4 (y compris un espace à la fin)
gregn3

1
Ceci est plus sûr:, console.log(('' + process.env.NODE_ENV).trim() === 'dev') // truecar cela ne générera pas d'erreur même si process.env.NODE_ENV n'est pas défini.
gregn3

52

Pour les personnes utilisant * nix (Linux, OS X, etc.), il n'y a aucune raison de le faire via une deuxième commande d'exportation, vous pouvez l'enchaîner dans le cadre de la commande d'appel:

NODE_ENV=development node server.js

Plus facile, non? :)


3
Un package comme cross-env permettra à cela de fonctionner également sur Windows.
walkerrandophsmith

35

Nous avons rencontré ce problème lors de l'utilisation de node sous Windows.

Plutôt que d'exiger de quiconque tente d'exécuter l'application de définir ces variables, nous avons fourni une solution de secours dans l'application.

var environment = process.env.NODE_ENV || 'development';

Dans un environnement de production, nous le définirions selon les méthodes habituelles (SET / export).


3
C'est la solution la plus pragmatique.
druskacik le

12

Vous pouvez utiliser le package npm cross-env . Il s'occupera d'ajuster la variable d'environnement et s'assurera également qu'elle fonctionne sur différentes plates-formes.

Dans la racine du projet, exécutez:

npm install cross-env

Puis dans votre package.json, sous scripts, ajoutez:

"start": "cross-env NODE_ENV=dev node your-app-name.js"

Puis dans votre terminal, à la racine du projet, démarrez votre application en exécutant:

npm start

La variable d'environnement sera alors disponible dans votre application en tant que process.env.NODE_ENV, vous pouvez donc faire quelque chose comme:

if (process.env.NODE_ENV === 'dev') {
  // Your dev-only logic goes here
}

Je ne pense pas que cela fonctionne. Je l'ai essayé dans mon projet actuel et NODE_ENV n'est toujours pas défini. Cela pourrait nécessiter plus de configuration pour fonctionner, semble-t-il.
Aakash Thakur

npm install --save-dev cross-env
DalSoft

9

dans package.json, nous devons configurer comme ci-dessous (fonctionne sous Linux et Mac OS)

la chose importante est "exporter NODE_ENV = production" après vos commandes de construction ci-dessous est un exemple:

  "scripts": {
     "start": "export NODE_ENV=production && npm run build && npm run start-server",
     "dev": "export NODE_ENV=dev && npm run build && npm run start-server",
  } 
  • pour l'environnement de développement, nous devons appuyer sur la commande "npm run dev"

  • pour un environnement de production, nous devons appuyer sur la commande "npm run start"


9

Dans macOS, pour ceux qui utilisent la version express 4.x.xet utilisent le DOTENVplugin, vous devez utiliser comme ceci:

  1. Après avoir installé le plugin, importez comme suit dans le fichier où vous lancez l'application: require('dotenv').config({path: path.resolve(__dirname+'/.env')});

  2. Dans le répertoire racine, créez un fichier '.env' et ajoutez la variable comme:

    NODE_ENV=development ou NODE_ENV = development



1

C'est dû à OS

Dans votre package.json, assurez-vous d'avoir vos scripts (où app.js est votre fichier js principal à exécuter et NODE_ENV est déclaré dans un fichier .env) .Eg:

"scripts": {
    "start": "node app.js",
    "dev": "nodemon server.js",
    "prod": "NODE_ENV=production & nodemon app.js"
  }

Pour les fenêtres

Configurez également votre variable de fichier .env avec NODE_ENV = development

Si votre fichier .env est dans un dossier pour le dossier par exemple.config, assurez-vous de le spécifier dans app.js (votre fichier js principal)

const dotenv = require ('dotenv'); dotenv.config ({chemin: './config/config.env'});


0

Si vous rencontrez ce problème dans React, vous avez besoin de react-scripts@0.2.3 et supérieur. Aussi pour d'autres variables d'environnement que NODE_ENVpour travailler dans React, elles doivent être préfixées avec REACT_APP_.


0

Dès que possible dans votre application, exigez et configurez dotenv.

require('dotenv').config()


-3

Vous pouvez également le définir par code, par exemple:

process.env.NODE_ENV = 'test';


67
Je décourage FORTEMENT quiconque de changer constamment l'identifiant d'environnement dans la logique d'application. Vous ne voulez jamais que l'application pense soudainement que c'est autre chose qu'elle ne l'est vraiment. Cela ne devrait jamais être changé qu'au niveau du système, comme le suggèrent de nombreuses autres réponses.
Kafoso du

7
Vous voudrez peut-être en savoir plus sur les applications à 12 facteurs: 12factor.net/config . Ce code serait une violation de cela. Il y a de bonnes raisons de séparer votre configuration de votre code.
jcollum

1
Cela pourrait être utile uniquement pour les tests automatisés, mais même dans ce cas, il pourrait être résumé et injecté dans votre code principal, au lieu d'être lu directement à partir d'env.
Angelos Pikoulas

Ne rejetons pas tellement cette réponse que le commentaire informatif de @Kafoso sera diminué. Ou ajoutez cette information à une réponse bien votée.
Vibhor Dube le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.