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.py
archivo que contenga la configuración estándar (zona horaria, etc.) y luego una local_settings.py
configuració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.json
para mis paquetes y aconfig.js
para 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.json
ay inserto una sección de dependencias:Cuando clono el proyecto en mi máquina local, corro
npm install
para 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_ENV
predeterminado 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.js
esto también se leerá automáticamente en su archivo .env..env
archivo en el control de versiones o el proceso de implementación.¿Están usando npm para iniciar sus scripts (env, etc.)?
Si usa
.env
archivos, puede incluirlos en supackage.json
y 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 found
source
(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.env
se 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.env
yprod.env
tener un solo.env
archivo 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
,test
oproduction
).fuente
Solo haz un simple
settings.js
conexports
:Luego, en tu guión, haz un
require
:Todos sus ajustes ahora estarán disponibles a través de la
settings
variable: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.js
config.public.js
- No en el control de versiones, estas son opciones específicas del entorno que anulanconfig.default.public.js
keys/
- 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.js
Más detalles: https://github.com/vngrs/konfig
fuente
Crearé una carpeta como config un nombre de archivo como
config.js
y 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
npm
mó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.js
archivoLlegué 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
undefined
significa que esta propiedad es requeridanull
significa que es opcionalmeConf
- actualmente el código está dirigido a un archivo debajoapp
.meConf
son 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
undefined
realmente significa 'requerido' ynull
significa '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_ENV
para 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
iniparser
resalta 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 que42
es 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
defaultsDeep
asegura 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-config
y 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
/config
carpeta. Primero carga eldefault.js
archivo, luego todos los demás archivos del/config
directorio, luego carga la configuración específica del entorno basada en la$NODE_ENV
variable.También permite anular esta configuración para el desarrollo local con un
local.js
entorno 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
config
para que se cuiden los bits de seguridad.Mira esto: https://www.attosol.com/secure-application-secrets-using-masterkey-in-azure-key-vault/
fuente