En Node.js, ¿por qué un script puede actualizar process.env? ¿Hay algún caso de uso práctico para eso?

Puede actualizarlo porque es solo un objeto normal. Un objeto poblado al inicio por el tiempo de ejecución, pero por lo demás no es diferente de ningún otro objeto JS.

En cuanto a los casos de uso prácticos, sí, hay docenas. Varias bibliotecas de terceros utilizan variables de entorno para extraer indicadores de tiempo de ejecución. Bluebird busca BLUEBIRD_DEBUG y BLUEBIRD_LONG_STACK_TRACES . Newrelic puede extraer toda su configuración completamente de NEW_RELIC_LICENSE_KEY como NEW_RELIC_LICENSE_KEY . Cientos de bibliotecas leen NODE_ENV para el comportamiento predeterminado (por ejemplo: express deshabilita los seguimientos de pila en el controlador de errores predeterminado y activa el almacenamiento en caché de vista cuando NODE_ENV está configurado en “producción”)

Esto hace que sea extremadamente fácil controlar estos comportamientos al comienzo de un script. Por ejemplo, su conjunto de pruebas puede deshabilitar explícitamente newrelic configurando process.env.NEW_RELIC_ENABLED = 'false' . Si usa el módulo de configuración de nodo, podría configurar una configuración de entorno específicamente para ese conjunto de pruebas y codificar sus pruebas para usar siempre ese entorno.

Cambiando eso, podría poner una sección env: {} en sus archivos de configuración y hacer Object.assign(process.env, config.env) para mezclar valores específicos del entorno que no desea configurar en los cuadros reales .

Siempre y cuando no tenga expectativas de que modificar el objeto realmente alterará el entorno del shell, es muy útil mutar.

En realidad, esto es útil para configurar las variables de entorno como db-host. Puede usar una base de datos local, de prueba y en vivo para cada entorno. Tendrá un archivo de configuración para la conexión de la base de datos en su proyecto. así que cada vez que extrae el código, debe mirar la configuración.

Para evitar tal escenario, se introducen los archivos env. Explicaré cómo lo estoy usando, podría ser útil para usted.

Primero cree un archivo .env.example y cree una plantilla básica de variables de entorno como host de base de datos, contraseña, etc. agregue este archivo a su proyecto (en git)

DB_HOST =
DB_USER =
DB_PASS =
DB_NAME =

Cree un archivo .env local y no lo envíe al git. para restringir la colisión ambiental. Hice esto para mi entorno local.

DB_HOST = localhost
DB_USER = root
DB_PASS = pwd
DB_NAME = new_db

Y en tu archivo app.js

var env = require (‘nodo-env-archivo’);
env (__ dirname + ‘/.env’);
console.log (process.env.DB_HOST)

Obtendrá la salida de la consola como localhost. El paquete node-env-file está disponible en npm node-env-file

Puede usar este objeto process.env en cualquier parte del proyecto. Configure todas las variables de entorno con este objeto. Eso es todo listo para funcionar. Cuando implemente un proyecto en un nuevo servidor, creará este archivo .env inicialmente y establecerá todas las variables, luego se olvidará de las variables de entorno cada vez que extraiga el código.

Sí, he hecho esto antes y fue útil y bien diseñado. Lo que hice fue leer algunos valores y luego asignarlos a process.env. Luego comencé un child_process y el cp heredó el entorno padre. Simplemente era muy conveniente tener esta flexibilidad. El dinamismo del lenguaje puede ser útil si lo usa correctamente.

Confía en mí … Trabajé con Java durante varios años y sé lo que es estar restringido.