Pregunta ¿Cómo almacenar las configuraciones / archivos de configuración de implementación de Node.js?


He estado trabajando en algunas aplicaciones de Node y he estado buscando un buen patrón para almacenar la configuración relacionada 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 contiene la configuración estándar (zona horaria, etc.), y luego una local_settings.py para configuraciones específicas 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, así que no tiene que estar atascado con todo lo demás en 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 fuente. La misma aplicación podría implementarse en diferentes servidores con configuraciones muy diferentes, y tener que lidiar con conflictos de combinación y todo eso no es mi idea de diversión.

Entonces, ¿hay algún tipo de marco / herramienta para esto, o todo el mundo simplemente piratea algo juntos?


569
2018-05-03 12:09


origen


Respuestas:


Uso un package.json para mis paquetes y una config.js para mi configuración, que se ve así:

var config = {};

config.twitter = {};
config.redis = {};
config.web = {};

config.default_stuff =  ['red','green','blue','apple','yellow','orange','politics'];
config.twitter.user_name = process.env.TWITTER_USER || 'username';
config.twitter.password=  process.env.TWITTER_PASSWORD || 'password';
config.redis.uri = process.env.DUOSTACK_DB_REDIS;
config.redis.host = 'hostname';
config.redis.port = 6379;
config.web.port = process.env.WEB_PORT || 9980;

module.exports = config;

Cargué la configuración de mi proyecto:

var config = require('./config');

y luego puedo acceder a mis cosas desde config.db_host, config.db_port, etc. Esto me permite usar parámetros codificados o parámetros almacenados en variables de entorno si no quiero almacenar contraseñas en el control de código fuente.

También genero un package.json e inserte una sección de dependencias:

"dependencies": {
  "cradle": "0.5.5",
  "jade": "0.10.4",
  "redis": "0.5.11",
  "socket.io": "0.6.16",
  "twitter-node": "0.0.2",
  "express": "2.2.0"
}

Cuando clono el proyecto en mi máquina local, ejecuto 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.


701
2018-05-03 13:54



Puede solicitar archivos JSON a partir del Nodo v0.5.x (haciendo referencia a esta respuesta)

config.json:

{
    "username" : "root",
    "password" : "foot"
}

app.js:

var config = require('./config.json');
log_in(config.username, config.password);

217
2018-02-03 23:43



Mucho más tarde, encontré un módulo Node.js bastante bueno para administrar la configuración: nconf.

Un simple ejemplo:

var nconf = require('nconf');

// First consider commandline arguments and environment variables, respectively.
nconf.argv().env();

// Then load configuration from a designated file.
nconf.file({ file: 'config.json' });

// Provide default values for settings not provided above.
nconf.defaults({
    'http': {
        'port': 1337
    }
});

// Once this is in place, you can just use nconf.get to get your settings.
// So this would configure `myApp` to listen on port 1337 if the port
// has not been overridden by any of the three configuration inputs
// mentioned above.
myApp.listen(nconf.get('http:port'));

También es compatible con el almacenamiento de configuraciones en Redis, escribiendo 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 Plancha iniciativa marco, por lo que debe ser bastante a prueba de futuro.

Revisa nconf en Github.


186
2017-12-19 15:28



Mi solución es bastante simple:

Cargue la configuración del entorno en ./config/index.js

var env = process.env.NODE_ENV || 'development'
  , cfg = require('./config.'+env);

module.exports = cfg;

Defina algunos valores predeterminados en ./config/config.global.js

var config = module.exports = {};

config.env = 'development';
config.hostname = 'dev.example.com';

//mongo database
config.mongo = {};
config.mongo.uri = process.env.MONGO_URI || 'localhost';
config.mongo.db = 'example_dev';

Anule los valores predeterminados en ./config/config.test.js

var config = require('./config.global');

config.env = 'test';
config.hostname = 'test.example';
config.mongo.db = 'example_test';

module.exports = config;

Utilizándolo en ./models/user.js:

var mongoose = require('mongoose')
, cfg = require('../config')
, db = mongoose.createConnection(cfg.mongo.uri, cfg.mongo.db);

Ejecutando su aplicación en el entorno de prueba:

NODE_ENV=test node ./app.js

Esto se explica con mayor detalle aquí: http://www.chovy.com/node-js/managing-config-variables-inside-a-node-js-application/


82
2017-11-26 23:20



También podrías mirar dotenv que sigue los principios de un aplicación de doce factores.

Solía ​​usar node-config, pero creé dotenv por ese motivo. Fue completamente inspirado por la biblioteca dotenv de ruby.

El uso es bastante fácil:

var dotenv = require('dotenv');
dotenv.load();

Luego, simplemente crea un archivo .env y coloca tu configuración allí de la siguiente manera:

S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
OTHER_SECRET_STUFF=my_cats_middle_name

Eso es dotenv para nodejs.


30
2018-04-30 00:59



Ustedes están usando npm para comenzar sus scripts (env etc)?

Si utiliza .env archivos puede incluirlos en su package.json y use npm para iniciar / iniciarlos.

Ejemplo:

{
  "name": "server",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node test.js",
    "start-dev": "source dev.env; node test.js",
    "start-prod": "source prod.env; node test.js"
  },
  "dependencies": {
    "mysql": "*"
  }
}

luego ejecuta los scripts npm:

$ npm start-dev

Aquí se describe https://gist.github.com/ericelliott/4152984 Todo el crédito a Eric Elliot


29
2017-10-22 23:54



También podrías mirar node-config que carga el archivo de configuración dependiendo de $ HOST y $ NODE_ENV variable (un poco como RoR): documentación.

Esto puede ser bastante útil para diferentes configuraciones de implementación (development, test o production)


23
2018-04-23 17:54



Solo haz un simple settings.js con exports:

exports.my_password = 'value'

Luego, en tu script, haz una require:

var settings = require('./settings.js');

Toda su configuración ahora estará disponible a través de settings variable:

settings.my_password // 'value'

20
2018-01-27 16:47