He estado trabajando en algunas aplicaciones Node, y he estado buscando un buen patrón para almacenar configuraciones relacionadas con la implementación. En el mundo de Django (de donde vengo), la práctica común sería tener un settings.pyarchivo que contenga la configuración estándar (zona horaria, etc.) y luego una local_settings.pyconfiguración específica de implementación, es decir. con qué base de datos hablar, qué socket de memcache, dirección de correo electrónico para los administradores, etc.
He estado buscando patrones similares para Node. Solo un archivo de configuración sería bueno, por lo que no tiene que estar atascado con todo lo demás app.js, pero me parece importante tener una forma de tener una configuración específica del servidor en un archivo que no está en control de código fuente. La misma aplicación bien podría implementarse en diferentes servidores con configuraciones muy diferentes y tener que lidiar con conflictos de fusión y todo eso no es mi idea de diversión.
Entonces, ¿hay algún tipo de marco / herramienta para esto, o todos simplemente piratean algo juntos?

Respuestas:
Utilizo a
package.jsonpara mis paquetes y aconfig.jspara mi configuración, que se ve así:Cargo la configuración de mi proyecto:
y luego puedo acceder a mis cosas de
config.db_host,config.db_port, etc ... Esto me permite ya sea hardcoded parámetros de uso, o parámetros almacenados en las variables ambientales si no desea almacenar las contraseñas en control de código fuente.También genero
package.jsonay inserto una sección de dependencias:Cuando clono el proyecto en mi máquina local, corro
npm installpara instalar los paquetes. Más información sobre eso aquí .El proyecto se almacena en GitHub, con controles remotos agregados para mi servidor de producción.
fuente
Puede requerir archivos JSON a partir del Nodo v0.5.x (haciendo referencia a esta respuesta )
config.json:
app.js:
fuente
Mucho después, encontré un módulo Node.js bastante bueno para administrar la configuración: nconf .
Un simple ejemplo:
También es compatible con el almacenamiento de configuraciones en Redis , escribir archivos de configuración, y tiene una API bastante sólida, y también está respaldado por una de las tiendas Node.js más respetadas, Nodejitsu , como parte de la iniciativa del marco Flatiron , por lo que debería ser bastante a prueba de futuro.
Echa un vistazo a nconf en Github .
fuente
Mi solución es bastante simple:
Cargue la configuración del entorno en ./config/index.js
Defina algunos valores predeterminados en ./config/config.global.js
Anule los valores predeterminados en ./config/config.test.js
Utilizándolo en ./models/user.js:
Ejecutando su aplicación en entorno de prueba:
fuente
NODE_ENVpredeterminado es "desarrollo". En su lugar, debe verificar la 'producción'.También puede buscar dotenv que sigue los principios de una aplicación de doce factores .
Solía usar node-config, pero creé dotenv por esa razón. Fue completamente inspirado por la biblioteca dotenv de ruby.
El uso es bastante fácil:
Luego solo crea un archivo .env y coloca su configuración allí de la siguiente manera:
Eso es dotenv para nodejs.
fuente
foreman run node xx.jsesto también se leerá automáticamente en su archivo .env..envarchivo en el control de versiones o el proceso de implementación.¿Están usando npm para iniciar sus scripts (env, etc.)?
Si usa
.envarchivos, puede incluirlos en supackage.jsony usar npm para obtenerlos / iniciarlos.Ejemplo:
luego ejecute los scripts npm:
Se describe aquí https://gist.github.com/ericelliott/4152984 Todo el crédito a Eric Elliot
fuente
source : not foundsource(o simplemente.) es un comando incorporado en shells de Unix (Bash, etc.) para leer y ejecutar comandos del archivo dado, en el shell actual . Es decir, los comandos no se ejecutan en un sub-shell. El efecto de eso en este ejemplo es que las variables de entorno definidas enprod.envse agregan al shell actual y, por lo tanto, se pasan a cualquier proceso secundario generado por este shell. Parece que estás usando Windows CMD. Vea esta pregunta para más detalles.dev.envyprod.envtener un solo.envarchivo por implementación.También puede buscar la configuración de nodo que carga el archivo de configuración dependiendo de la variable $ HOST y $ NODE_ENV (un poco como RoR): documentación .
Esto puede ser muy útil para diferentes valores de despliegue (
development,testoproduction).fuente
Solo haz un simple
settings.jsconexports:Luego, en tu guión, haz un
require:Todos sus ajustes ahora estarán disponibles a través de la
settingsvariable:fuente
Voy a lanzar mi sombrero al ring aquí porque ninguna de estas respuestas aborda todos los componentes críticos que prácticamente cualquier sistema necesita. Consideraciones:
Así es como hago mi configuración:
config.default.private.js- En el control de versiones, estas son opciones de configuración predeterminadas que solo puede ver su backend.config.default.public.js- En el control de versiones, estas son opciones de configuración predeterminadas que pueden verse en el backend y la interfazconfig.dev.private.js- Si necesita diferentes valores predeterminados privados para dev.config.dev.public.js- Si necesita diferentes valores predeterminados públicos para dev.config.private.js- No en el control de versiones, estas son opciones específicas del entorno que anulanconfig.default.private.jsconfig.public.js- No en el control de versiones, estas son opciones específicas del entorno que anulanconfig.default.public.jskeys/- Una carpeta donde cada archivo almacena un secreto diferente de algún tipo. Esto tampoco está bajo control de versión (las claves nunca deben estar bajo control de versión).Utilizo archivos javascript antiguos para la configuración, así que tengo todo el poder del lenguaje javascript (incluidos los comentarios y la capacidad de hacer cosas como cargar el archivo de configuración predeterminado en el archivo específico del entorno para que luego se puedan anular). Si desea utilizar variables de entorno, puede cargarlas dentro de esos archivos de configuración (aunque recomiendo no usar env vars por la misma razón que no recomiendo usar archivos json: no tiene el poder de un lenguaje de programación para construir su configuración).
La razón por la que cada clave está en un archivo separado es para uso del instalador. Esto le permite tener un instalador que crea claves en la máquina y las almacena en la carpeta de claves. Sin esto, su instalador podría fallar cuando carga su archivo de configuración que no puede acceder a sus claves. De esta manera, puede recorrer el directorio y cargar cualquier archivo de clave que se encuentre en esa carpeta sin tener que preocuparse por lo que existe y lo que no existe en ninguna versión de su código.
Como probablemente tenga claves cargadas en su configuración privada, definitivamente no desea cargar su configuración privada en ningún código de interfaz. Si bien es probable que sea estrictamente más ideal separar completamente la base de código de su interfaz de su back-end, muchas veces PITA es una barrera lo suficientemente grande como para evitar que las personas lo hagan, por lo tanto, configuración privada vs pública. Pero hay dos cosas que hago para evitar que la configuración privada se cargue en la interfaz:
Una última cosa: su configuración debe cargarse en el navegador a través de un archivo completamente separado que cualquiera de sus otros códigos frontend. Si agrupa su código de interfaz, la configuración pública debe construirse como un paquete completamente separado. De lo contrario, su configuración ya no es realmente configuración, es solo parte de su código. Config necesita poder ser diferente en diferentes máquinas.
fuente
Condenar es otra opción que agrega un esquema para la validación. Al igual que nconf, admite la configuración de carga de cualquier combinación de variables de entorno, argumentos, archivos y objetos json.
Ejemplo de README:
Artículo de inicio: Configuraciones de domesticación con nodo-convicto
fuente
Puede usar Konfig para archivos de configuración específicos del entorno. Carga archivos de configuración json o yaml automáticamente, tiene un valor predeterminado y características de configuración dinámica.
Un ejemplo del repositorio de Konfig:
En desarrollo:
En producción, supongamos que comenzamos la aplicación con
$ NODE_ENV=production PORT=4567 node app.jsMás detalles: https://github.com/vngrs/konfig
fuente
Crearé una carpeta como config un nombre de archivo como
config.jsy luego usaré este archivo siempre que sea necesario como se muestra a continuaciónEjemplo de config.js
Entonces, si quiero usar este archivo de configuración en alguna parte
Primero importaré como a continuación
var config = require('./config');y puedo acceder a los valores de la siguiente manera
fuente
Solo use el
npmmóduloconfig(más de 300000 descargas)https://www.npmjs.com/package/config
Node-config organiza configuraciones jerárquicas para las implementaciones de su aplicación.
Le permite definir un conjunto de parámetros predeterminados y extenderlos para diferentes entornos de implementación (desarrollo, qa, puesta en escena, producción, etc.).
fuente
Es mejor separar las configuraciones de 'desarrollo' y 'producción' .
Utilizo la siguiente manera: Aquí está mi archivo config / index.js :
Para requerir la configuración use lo siguiente:
Entonces puedes usar tu objeto de configuración:
fuente
module.exports = config;al final delconfig/index.jsarchivoLlegué un poco tarde en el juego, pero no pude encontrar lo que necesitaba aquí, ni en ningún otro lado, así que escribí algo yo mismo.
Mis requisitos para un mecanismo de configuración son los siguientes:
settings-overrides.js: que se ve igual pero permite anular la configuración ensettings.js. La idea aquí es modificar la configuración fácilmente sin cambiar el código. Lo encuentro útil para saas.Aunque me preocupo menos por los entornos de soporte, explicaré cómo agregarlo fácilmente a mi solución
Explicación
undefinedsignifica que esta propiedad es requeridanullsignifica que es opcionalmeConf- actualmente el código está dirigido a un archivo debajoapp.meConfson los archivos de anulación a los que está dirigidoconf/dev, lo cual es ignorado por mis vcs.publicConfiguration- será visible desde el front-end y el back-end.privateConfiguration- será visible solo desde el back-end.sendPublicConfiguration- una ruta que expondrá la configuración pública y la asignará a una variable global. Por ejemplo, el siguiente código expondrá la configuración pública como variable global myConf en el front-end. Por defecto usará el nombre de la variable globalconf.app.get ("/ backend / conf", require ("conf"). sendPublicConfiguration);
Lógica de anulaciones
Agregar compatibilidad con el entorno
Aunque no encuentro útil un "soporte ambiental", tal vez alguien lo haga.
Para agregar compatibilidad con el entorno, debe cambiar la declaración de requerimiento meConf a algo como esto (pseudocódigo)
if (environment == "production") {meConf = require ("../ conf / dev / meConf"). production; }
if (environment == "desarrollo") {meConf = require ("../ conf / dev / meConf"). desarrollo; }
Del mismo modo, puede tener un archivo por entorno
e importar el correcto. El resto de la lógica permanece igual.
fuente
undefinedrealmente significa 'requerido' ynullsignifica 'opcional'. ¿Entonces el contenedor amarillo es para plásticos y el azul para papel de desecho? bien, pero tuve que leer el manual antes de tirar la basura.un ejemplo alternativo que acabo de usar porque quería más flexibilidad que un archivo .json típico pero no quería que se abstrajera en una biblioteca que requeriría una dependencia es algo como esto. Básicamente, exportando una función invocada inmediatamente que devolvió un objeto con los valores que quería establecer. Da mucha flexibilidad.
Hay una explicación mucho mejor con un ejemplo completo aquí. Uso de archivos de configuración en Node.js
fuente
Sé que esta es una publicación muy antigua. Pero quiero compartir mi módulo para configurar variables de entorno, creo que es una solución muy flexible. Aquí está el módulo json-configurator
Luego puede usar
process.env.NODE_ENVpara obtener todas las variables para su entorno.fuente
Además del módulo nconf mencionado en esta respuesta , y node-config mencionado en esta respuesta , también hay node-iniparser e IniReader , que parecen ser analizadores de archivos de configuración .ini más simples.
fuente
iniparserresalta con orgullo el hecho de que saben cómo analizar secciones en la configuración ... en 2013 ... si necesita un anidamiento más profundo, ¿dices[foo/bar]?[foo\bar]?bar.baz=42?bar/baz=42?bar\baz=42?bar:baz=42? ¿Cómo sabes que42es un número? ¡podría ser un texto de todos los dígitos! —por ejemplo, XML, tirar YAML, tirar WIN.INI, abrazar a JSON, las preocupaciones se han ido.Recientemente lancé un pequeño módulo para cargar cualquier tipo de archivos de configuración. Es bastante sencillo, puede consultarlo en https://github.com/flesler/config-node
fuente
Puede usar pconf: https://www.npmjs.com/package/pconf
Ejemplo:
fuente
Aquí hay un enfoque ordenado inspirado en este artículo . No requiere ningún paquete adicional, excepto el omnipresente paquete lodash . Además, le permite administrar los valores predeterminados anidados con sobrescrituras específicas del entorno.
Primero, cree una carpeta de configuración en la ruta raíz del paquete que tenga este aspecto
aquí está el archivo index.js
Ahora supongamos que tenemos valores predeterminados.
y desarrollo.json así
si haces
config = require('./config')aquí es lo que obtendrásObserve que obtiene todos los valores predeterminados, excepto los definidos en archivos específicos del entorno. Para que pueda administrar una jerarquía de configuración. El uso
defaultsDeepasegura que incluso puede tener valores predeterminados anidados.fuente
Para aquellos que visitan este viejo hilo, aquí hay un paquete que considero bueno.
https://www.npmjs.org/package/config
fuente
Probé algunas de las soluciones sugeridas aquí, pero no estaba satisfecho con ellas, así que creé mi propio módulo. Se llama
mikro-configy la principal diferencia es que respeta la convención sobre la configuración, por lo que solo puede requerir el módulo y comenzar a usarlo.Usted almacena su configuración en archivos js simples o json de la
/configcarpeta. Primero carga eldefault.jsarchivo, luego todos los demás archivos del/configdirectorio, luego carga la configuración específica del entorno basada en la$NODE_ENVvariable.También permite anular esta configuración para el desarrollo local con un
local.jsentorno específico/config/env/$NODE_ENV.local.js.Puedes echarle un vistazo aquí:
https://www.npmjs.com/package/mikro-config
https://github.com/B4nan/mikro-config
fuente
Durante mucho tiempo, solía usar el enfoque mencionado en la solución aquí. Sin embargo, existe una preocupación sobre la seguridad de los secretos en texto claro. Puedes usar otro paquete encima de
configpara que se cuiden los bits de seguridad.Mira esto: https://www.attosol.com/secure-application-secrets-using-masterkey-in-azure-key-vault/
fuente