node.js - ¿Cómo puedo definir mi esquema Convict una vez y reutilizarlo para múltiples objetos en mi configuración?
Estoy usando convict para definir y leer la configuración en mi aplicación Node con Typescript. Tendré que conectarme a varios tipos de bases de datos diferentes. Todas ellas tendrán el mismo formato de configuración: servidor, nombre de usuario, contraseña, nombre de la base de datos. Por supuesto, podría definirlas una por una en el esquema y estaría bien, pero ¿hay alguna forma de definir el esquema para una base de datos y luego hacer que el archivo de configuración JSON sea un arreglo de bases de datos, al cual luego podría acceder por el nombre como si fuera una base de datos?
Ejemplo de cómo definir cada base de datos en el esquema:
var convict = require('convict');
// Define schema
var config = convict({
dbs: {
db1: {
host: {
doc: 'Database host name/IP',
format: '*',
default: 'server1.dev.test'
},
user:{
doc: 'Database Username',
format: String
},
pass: {
doc: 'Database password',
format: String,
sensitive: true
}
name: {
doc: 'Database name',
format: String,
default: 'users'
}
},
db2: {
host: {
doc: 'Database host name/IP',
format: '*',
default: 'server1.dev.test'
},
user:{
doc: 'Database Username',
format: String
},
pass: {
doc: 'Database password',
format: String,
sensitive: true
}
name: {
doc: 'Database name',
format: String,
default: 'users'
}
},
}
});
// Load environment dependent configuration
config.loadFile('./config/dev.json');
// Perform validation
config.validate({allowed: 'strict'});
module.exports = config.getProperties();
Entonces accedería a ellos de la siguiente manera :
config.dbs.db1.userDado que tendré al menos 5 bases de datos y ese número podría crecer con el tiempo, me gustaría no tener que redefinir el mismo esquema exacto para cada una y, en cambio, definirlo una vez y luego permitir que la configuración tenga tantos objetos como sea necesario en el arreglo dbs. Luego, idealmente, podría acceder a ellos con algo como config.dbs['db1'].user.
Respuesta #1
La pregunta es un poco antigua, pero respondo de todos modos. Podrías usar una función para generar el objeto de esquema así
var convict = require('convict');
// Define schema
var config = convict({
dbs: {
db1: databaseSchema('server1.dev.test'),
db2: databaseSchema('server2.dev.test')
}
});
function databaseSchema(url) {
return {
host: {
doc: 'Database host name/IP',
format: '*',
default: url
},
user:{
doc: 'Database Username',
format: String,
default: 'db_user'
},
pass: {
doc: 'Database password',
format: String,
sensitive: true,
default: '',
},
name: {
doc: 'Database name',
format: String,
default: 'users'
}
}
}
// Load environment dependent configuration
//config.loadFile('./config/dev.json');
// Perform validation
config.validate({allowed: 'strict'});
console.log(config.getProperties())
module.exports = config.getProperties();
La siguiente configuración se muestra durante la ejecución
{
dbs: {
db1: {
host: 'server1.dev.test',
user: 'db_user',
pass: '',
name: 'users'
},
db2: {
host: 'server2.dev.test',
user: 'db_user',
pass: '',
name: 'users'
}
}
}
