process.env.NODE_ENV no está definido

168

Estoy tratando de seguir un tutorial sobre NodeJs. No creo que me haya perdido nada, pero cada vez que llamo process.env.NODE_ENVal único valor que obtengo no está definido. Según mi investigación, el valor predeterminado debería ser 'desarrollo'. ¿Cómo se establece dinámicamente este valor y dónde se establece inicialmente?

basheps
fuente
para configurar NODE_ENV para aplicaciones heroku que puedes usar:heroku config:set NODE_ENV="production"
Connor Leech
14
Aunque las respuestas a continuación resolverán el problema temporalmente estableciendo la variable de entorno, la lección más importante aquí debería ser que nunca se puede saber si se establecerá alguna variable de entorno ... Así que escriba su código en consecuencia y pruebe si está configurado y, de ser así, a qué. No hagas suposiciones al respecto.
Stijn de Witt

Respuestas:

193

process.env es una referencia a su entorno, por lo que debe establecer la variable allí.

Para establecer una variable de entorno en Windows :

SET NODE_ENV=development

en OS X o Linux :

export NODE_ENV=development
James Tikalsky
fuente
44
puede agregar que si NODE_ENV no está configurado, la aplicación se comporta como en modo "desarrollo"
Rocco
1
Para Linux, vi ~ / .bash_profile, luego inserte NODE_ENV = desarrollo y guarde.
stonyau
66
En caso de que alguien más tenga problemas ... hay una diferencia entre "SET V = VAL" y "SET V = VAL". Los espacios importan.
willem
44
Tenga en cuenta que el módulo "cross-env" hará algo similar a lo anterior, y funcionará tanto en OSX como en Windows: "cross-env NODE_ENV = development". Primero debe instalar cross-env: "npm install cross-env --save". Tenga eso en un script en su package.json y estará listo para usar en ambas plataformas.
Antonio Brandao
66
No funciono para mi. Ejecuté export NODE_ENV=developmenten mi terminal Mac antes de hacer una react-native run-iosdesde la misma terminal. Al depurar, el valor de process.env.NODE_ENVno está definido.
Ash
58

consejos

en package.json:

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

en 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) 

Entonces, esto puede ser mejor:

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

o

console.log(process.env.NODE_ENV.trim() === 'dev') // true
Kenberkeley
fuente
2
Lo que puede hacer es esto, para que no tenga que recortar:"start": "set NODE_ENV=dev&& node app.js"
Z. Khullah
Excelente observación, console.log(process.env.NODE_ENV.length) // 4 (incluido un espacio al final)
gregn3
1
Esto es más seguro: console.log(('' + process.env.NODE_ENV).trim() === 'dev') // trueya que no arrojará un error incluso si process.env.NODE_ENV no está definido.
gregn3
52

Para las personas que usan * nix (Linux, OS X, etc.), no hay razón para hacerlo a través de un segundo comando de exportación, puede encadenarlo como parte del comando de invocación:

NODE_ENV=development node server.js

Más fácil, no? :)

mlaccetti
fuente
3
Un paquete como cross-env también permitirá que funcione en Windows.
walkerrandophsmith
35

Nos encontramos con este problema cuando trabajamos con el nodo en Windows.

En lugar de exigir a cualquiera que intente ejecutar la aplicación que establezca estas variables, proporcionamos un respaldo dentro de la aplicación.

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

En un entorno de producción, lo definiríamos según los métodos habituales (SET / export).

Jacob
fuente
3
Esta es la solución más pragmática.
druskacik
12

Puede usar el paquete npm cross-env . Se encargará de recortar la variable de entorno y también se asegurará de que funcione en diferentes plataformas.

En la raíz del proyecto, ejecute:

npm install cross-env

Luego, en su package.json, en scripts, agregue:

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

Luego, en su terminal, en la raíz del proyecto, inicie su aplicación ejecutando:

npm start

La variable de entorno estará disponible en su aplicación como process.env.NODE_ENV, por lo que podría hacer algo como:

if (process.env.NODE_ENV === 'dev') {
  // Your dev-only logic goes here
}
Liran H
fuente
No creo que esto funcione. Lo probé en mi proyecto actual y NODE_ENV aún no está definido. Parece que esto necesita algo más de configuración para funcionar.
Aakash Thakur
1
Busqué alrededor de dos horas para encontrar esta respuesta, ¡gracias!
Bob
npm install --save-dev cross-env
DalSoft
9

en package.json tenemos que configurar como a continuación (funciona en Linux y Mac OS)

lo importante es "exportar NODE_ENV = producción" después de que los siguientes comandos de compilación sean un ejemplo:

  "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",
  } 
  • para el entorno de desarrollo, tenemos que presionar el comando "npm run dev"

  • para un entorno de producción, tenemos que presionar el comando "npm run start"

DV Yogesh
fuente
9

En macOS para aquellos que usan la versión express 4.x.xy usan el DOTENVcomplemento, necesitan usar así:

  1. Después de instalar el complemento, importe lo siguiente en el archivo donde inicia la aplicación: require('dotenv').config({path: path.resolve(__dirname+'/.env')});

  2. En el directorio raíz, cree un archivo '.env' y agregue la variable como:

    NODE_ENV=development o NODE_ENV = development

NRP
fuente
6

En UBUNTU use:

$ export NODE_ENV = prueba

Gilbert Flamino
fuente
1

Se debe al sistema operativo

En su package.json, asegúrese de tener sus scripts (donde app.js es su archivo js principal que se ejecutará y NODE_ENV se declara en un archivo .env) .Eg:

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

Para ventanas

También configure su variable de archivo .env con NODE_ENV = desarrollo

Si su archivo .env está en una carpeta para, por ejemplo, la carpeta de configuración, asegúrese de especificar en app.js (su archivo js principal)

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

Adrian Almeida
fuente
0

Si te enfrentaste a este probem en React, necesitas [email protected] y superior. También para otras variables de entorno que no sean NODE_ENVtrabajar en React, deben tener el prefijo REACT_APP_.

Daniel
fuente
0

Tan pronto como sea posible en su aplicación, requiera y configure dotenv.

require('dotenv').config()

Khushwant kodecha
fuente
-3

También puede configurarlo por código, por ejemplo:

process.env.NODE_ENV = 'test';

joaquindev
fuente
67
FUERZAMENTE desaliento a cualquiera de cambiar el identificador de entorno en la lógica de la aplicación. Nunca querrás que la aplicación de repente piense que es algo más de lo que realmente es. Esto solo debería cambiarse a nivel del sistema, como sugieren muchas de las otras respuestas.
Kafoso
77
Es posible que desee leer acerca de las aplicaciones de 12 factores: 12factor.net/config . Este código sería una violación de eso. Hay buenas razones para mantener su configuración separada de su código.
jcollum
1
Puede ser útil solo para pruebas automatizadas, pero incluso así podría resumirse e inyectarse en su código principal, en lugar de leerse directamente desde env.
Angelos Pikoulas el
No rechacemos tanto esta respuesta que disminuya el comentario informativo de @Kafoso. O agregue esta información a alguna respuesta bien votada.
Vibhor Dube