Node.js: configuración de variables de entorno

Intento seguir un tutorial y dice:

“Hay algunas maneras de cargar credenciales.

  1. Cargado de variables de entorno,
  2. Cargado desde un archivo JSON en el disco,

Las claves deben ser las siguientes:

USER_ID, USER_KEY 

… Esto significa que si configura adecuadamente las variables de su entorno, no necesita administrar las credenciales en su aplicación “.

Basado en Google, parece que necesito establecer las variables en process.env ? ¿Cómo y dónde configuro estas credenciales? Ejemplo por favor.

Las variables de entorno (en este caso) se utilizan para pasar credenciales a su aplicación. USER_KEY puede acceder a USER_ID y USER_KEY desde process.env.USER_ID y process.env.USER_KEY respectivamente. No necesita editarlos, solo tiene acceso a sus contenidos.

Parece que simplemente le dan la opción de cargar su USER_ID y USER_KEY desde process.env o algún archivo específico en el disco.

Ahora, la magia sucede cuando ejecuta la aplicación.

USER_ID=239482 USER_KEY=foobar node app.js

Eso pasará el ID de usuario 239482 y la clave de usuario como foobar . Esto es adecuado para probar, sin embargo, para la producción, probablemente esté configurando algunos scripts bash para exportar variables.

Recomiendo examinar el paquete dotenv.

https://github.com/motdotla/dotenv

Es similar a la biblioteca sugerida en la respuesta de @Benxamin, pero es mucho más limpia y no requiere ningún script bash. También vale la pena señalar que la base de código es popular y está bien mantenida.

Básicamente, necesitas un archivo .env (que recomiendo ser ignorado de tu git / mercurial / etc):

 FOO=bar BAZ=bob 

Luego, en el archivo de entrada de la aplicación, inserte la siguiente línea lo antes posible:

 require('dotenv').config(); 

Auge. Hecho. ‘process.env’ ahora contendrá las variables anteriores:

 console.log(process.env.FOO); // bar 

El archivo ‘.env’ no es obligatorio, por lo que no debes preocuparte porque tu aplicación no funcione.

Solo proporcione los valores env en la línea de comando

 USER_ID='abc' USER_KEY='def' node app.js 

Si desea una opción de administración, pruebe el paquete envs npm. Devuelve los valores del entorno si están configurados. De lo contrario, puede especificar un valor predeterminado que se almacena en una variable de objeto predeterminada global si no está en su entorno.

Usar .env (“punto ee-en-vee”) o archivos de entorno es bueno por muchas razones. Las personas pueden administrar sus propias configuraciones. Puede implementar diferentes entornos (dev, stage, prod) para servicios en la nube con sus propias configuraciones de entorno. Y puede establecer valores predeterminados razonables.

Dentro de su archivo .env cada línea es una entrada, como este ejemplo:

 NODE_ENV=development API_URL=http://api.domain.com TRANSLATION_API_URL=/translations/ GA_UA=987654321-0 NEW_RELIC_KEY=hi-mom SOME_TOKEN=asdfasdfasdf SOME_OTHER_TOKEN=zxcvzxcvzxcv 

No debe incluir .env en su repository de control de versiones (agréguelo a su archivo .gitignore ).

Para obtener variables del archivo .env en su entorno, puede usar un script bash para hacer el equivalente de export NODE_ENV=development justo antes de iniciar su aplicación.

 #!/bin/bash while read line; do export "$line"; done  

Entonces esto va en tu aplicación javascript:

 var envs = require('envs'); // If NODE_ENV is not set, // then this application will assume it's prod by default. app.set('environment', envs('NODE_ENV', 'production')); // Usage examples: app.set('ga_account', envs('GA_UA')); app.set('nr_browser_key', envs('NEW_RELIC_BROWSER_KEY')); app.set('other', envs('SOME_OTHER_TOKEN)); 

Puede establecer la variable de entorno a través de la variable global de proceso de la siguiente manera:

 process.env['NODE_ENV'] = 'production'; 

Funciona en todas las plataformas.

Depende de tu sistema operativo y tu caparazón

En Linux con shell bash, crea variables de entorno como esta (en la consola):

 export FOO=bar 

Para obtener más información sobre las variables de entorno en ubuntu (por ejemplo):

Variables de entorno en ubuntu

Para los usuarios de Windows, esta pregunta de desbordamiento de stack y respuesta superior es bastante útil sobre cómo establecer variables de entorno a través de la línea de comando

¿Cómo puedo configurar NODE_ENV = producción en Windows?

Encontré una buena herramienta para hacer esto.

node-env-file

Analiza y carga archivos de entorno (que contienen exportaciones de variables ENV) en el entorno Node.js, es decir, process.env – Utiliza este estilo:

 .env # some env variables FOO=foo1 BAR=bar1 BAZ=1 QUX= # QUUX= 

Paso 1: Agregue sus variables de entorno a su archivo apropiado. Por ejemplo, su entorno de ensayo podría denominarse .env.staging , que contiene las variables de entorno USER_ID y USER_KEY , específicas de su entorno de ensayo.

Paso 2: en su archivo package.json , agregue lo siguiente:

 "scripts": { "build": "sh -ac '. ./.env.${REACT_APP_ENV}; react-scripts build'", "build:staging": "REACT_APP_ENV=staging npm run build", "build:production": "REACT_APP_ENV=production npm run build", ... } 

luego llámalo en tu script de despliegue así:

 npm run build:staging 

Configuración súper simple y funciona como un encanto!

Fuente: https://medium.com/@tacomanator/environments-with-create-react-app-7b645312c09d

Importante para Windows: hay varias formas de establecer variables de entorno. Pero la mayoría de ellos NO son persistentes, son temporales para el shell actual. (como SET SWEDISH_CHEF="bork bork" o $env:SWEDISH_CHEF = "bork bork" )

Para que persista use este comando de PowerShell: [Environment]::SetEnvironmentVariable("SWEDISH_CHEF", "bork bork", "User") nota: el 3er argumento, "User" , especifica el nivel (también puede ser "Process" o "Machine" pero de lo que he encontrado "User" es en realidad el utilizado para process.env )

Para verificar que persistió: Inicie un nuevo terminal, ejecute node e ingrese process.env.SWEDISH_CHEF en el shell del nodo para imprimir el valor.

editar: el env var no parece persistir después del reinicio. así que terminé configurándolo a través de la GUI en Mi PC para que perdurara para siempre

edit2: una opción más simple es, por supuesto, solo crear un archivo .env en su carpeta de proyectos. SWEDISH_CHEF="bork bork"

Como expansión de la respuesta de @ctrlplusb,
Le sugiero que también eche un vistazo al paquete env-dot-prop .

Le permite establecer / obtener propiedades de process.env usando una dot-path .

Supongamos que su process.env contiene lo siguiente:

 process.env = { FOO_BAR: 'baz' 'FOO_🦄': '42' } 

Entonces puedes manipular las variables de entorno así:

 const envDotProp = require('env-dot-prop'); console.log(process.env); //=> {FOO_BAR: 'baz', 'FOO_🦄': '42'} envDotProp.get('foo'); //=> {bar: 'baz', '🦄': '42'} envDotProp.get('foo.🦄'); //=> '42' envDotProp.get('foo.🦄', {parse: true}); //=> 42 envDotProp.set('baz.foo', 'bar'); envDotProp.get('', {parse: true}); //=> {foo: {bar: 'baz', '🦄': 42}, baz: {foo: 'bar'}} console.log(process.env); //=> {FOO_BAR: 'baz', 'FOO_🦄': '42', BAZ_FOO: 'bar'} envDotProp.delete('foo'); envDotProp.get(''); //=> {baz: {foo: 'bar'}} console.log(process.env); //=> {BAZ_FOO: 'bar'} 

Esto le ayuda a analizar las variables de entorno y usarlas como un objeto de configuración en su aplicación.
También lo ayuda a implementar una configuración de 12 factores .

Una muy buena forma de hacer las variables de entorno que he utilizado con éxito es la siguiente:

A. Tener diferentes archivos de configuración :

  1. dev.js // esto tiene todas las variables de entorno solo para desarrollo
    El archivo contiene:

     module.exports = { ENV: 'dev', someEnvKey1 : 'some DEV Value1', someEnvKey2 : 'some DEV Value2' }; 
  2. stage.js // esto tiene todas las variables de entorno solo para desarrollo

     .. 
  3. qa.js // esto tiene todas las variables de entorno solo para pruebas qa
    El archivo contiene:

     module.exports = { ENV: 'dev', someEnvKey1 : 'some QA Value1', someEnvKey2 : 'some QA Value2' }; 

NOTA : los valores cambian con el entorno, principalmente, pero las claves permanecen iguales.

  1. puedes tener mas

  2. z__prod.js // esto tiene todas las variables de entorno para producción / solo en vivo
    NOTA: este archivo nunca se incluye para la implementación

  3. Coloque todos estos archivos de configuración en / config / folder

     /config/dev.js /config/qa.js /config/z__prod.js /setenv.js /setenv.bat /setenv.sh 

NOTA : El nombre de prod es diferente de otros, ya que no sería usado por todos.

B. Establecer las variables de entorno OS / Lambda / AzureFunction / GoogleCloudFunction desde el archivo de configuración

Ahora, idealmente, estas variables de configuración en archivo deberían ir como variables de entorno del sistema operativo (o, variables de función LAMBDA, o variables de función de Azure, funciones de Google Cloud, etc.)

entonces, escribimos automatización en el sistema operativo Windows (u otro)

  1. Supongamos que escribimos el archivo ‘ setenv ‘ bat, que toma un argumento que es el entorno que queremos establecer

  2. Ahora ejecuta ” setenv dev

a) Esto toma la entrada de la variable de argumento pasada (‘dev’ por el momento)
b) lea el archivo correspondiente (‘config \ dev.js’)
c) establece las variables de entorno en el sistema operativo Windows (u otro)

Por ejemplo,

Los contenidos de setenv.bat pueden ser:

  node setenv.js 

Los contenidos de setenv.js pueden ser:

  // import "process.env.ENV".js file (dev.js example) // loop the imported file contents // set the environment variables in Windows OS (or, Lambda, etc.) 

Eso es todo , su entorno está listo para usar.

Cuando haga ‘ setenv qa ‘, todas las variables de entorno qa estarán listas para su uso desde qa.js, y estarán listas para ser utilizadas por el mismo progtwig (que siempre solicita process.env.someEnvKey1, pero el valor que obtiene es qa uno).

Espero que ayude.

Me estaba volviendo indefinido después de establecer un sistema env var. Cuando coloco APP_VERSION en el env env del usuario, entonces puedo mostrar el valor del nodo a través de process.env.APP_VERSION