¿Cómo almacenar los archivos de configuración/ajustes de implementación de Node.js?

Resuelto mikl asked hace 13 años • 30 respuestas

He estado trabajando en algunas aplicaciones de Node y he estado buscando un buen patrón para almacenar configuraciones relacionadas con la implementación. En el mundo 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 para la implementación, es decir. con qué base de datos hablar, qué socket de Memcache, dirección de correo electrónico de 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 intercalado con todo lo demás en app.js, pero encuentro importante tener una manera de tener una configuración específica del servidor en un archivo que no está en el 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, ¿existe algún tipo de marco/herramienta para esto, o todos simplemente piratean algo por sí mismos?

mikl avatar May 03 '11 19:05 mikl
Aceptado

Utilizo a package.jsonpara mis paquetes y a config.jspara 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;

Cargo 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 ambientales si no quiero almacenar contraseñas en el control de fuente.

También genero package.jsone inserto 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, lo ejecuto npm installpara instalar los paquetes. Más información sobre eso aquí .

El proyecto se almacena en GitHub y se agregaron controles remotos para mi servidor de producción.

noli avatar May 03 '2011 13:05 noli

Puede requerir archivos JSON a partir de Node v0.5.x ( haciendo referencia a esta respuesta )

config.json:

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

aplicación.js:

var config = require('./config.json');
log_in(config.username, config.password);
TinyTimZamboni avatar Feb 03 '2013 23:02 TinyTimZamboni

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

Un ejemplo sencillo:

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 admite el almacenamiento de configuraciones en Redis , la escritura de 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 preparado para el futuro.

Consulte nconf en Github .

mikl avatar Dec 19 '2011 15:12 mikl

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;

Usá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 un entorno de prueba:

NODE_ENV=test node ./app.js
chovy avatar Nov 26 '2012 23:11 chovy

También puedes consultar dotenv , que sigue los principios de una aplicación de doce factores .

Solía ​​​​usar node-config, pero creé dotenv por ese motivo. Estaba completamente inspirado en 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 su configuración allí de esta manera:

S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
OTHER_SECRET_STUFF=my_cats_middle_name

Eso es dotenv para nodejs.

scottmotte avatar Apr 30 '2014 00:04 scottmotte