sails.js – Quiero agregar dinámicamente la conexión DB después de levantar las velas

Durante el levantamiento de velas todavía no tengo toda la información de conexión para mi DB.

¿Hay alguna forma de tener valores de configuración que dependan de promesas o crear dinámicamente una conexión después de que se complete el levantamiento de velas?

Obviamente, tendría que agregar una política o un gancho para manejar las solicitudes a las rutas que necesitan el modelo si aún no estaba disponible, pero en este momento no veo cómo dejar que las velas se eleven hasta que ya sepa la información de conexión debe estar en las configuraciones).

Espero que me esté perdiendo una forma de crear conexiones y modelos de cables dinámicamente.

Sí; Dos cosas en sails.js te permiten hacer esto. Uno existe actualmente, y uno está por venir.

  1. https://github.com/sgress454/sails-hook-autoreload . Este módulo busca cambios en el archivo de configuración en el disco y volverá a cargar los modelos de ORM cuando cambie un archivo.

  2. Estoy trabajando en esta característica exacta en este momento, y mi plan es publicar mi trabajo a fines de la próxima semana. Estoy de acuerdo en que será muy útil.

La API le permitirá definir nuevos modelos y conexiones en la base de datos sobre la marcha. Las devoluciones de llamada del ciclo de vida de sails.js se encargan de actualizar el ORM y los adaptadores, etc. Se basa en eventos y le permitirá disparar eventos manualmente para actualizar el ORM / Conexiones, de este modo:

  • sails.emit('hook:dynamic-orm:reload')

¿Esto es lo que necesitas?

Actualización : En Sails v1.0 / Waterline v0.13, esto se puede lograr accediendo al controlador subyacente sin estado; por ejemplo, sails.getDatastore().driver . Esto se puede usar en cualquier adaptador de base de datos que admita la nueva interfaz del controlador sin estado, incluidos MySQL, PostgreSQL y MongoDB.


Antes de Sails v1.0, esto no era oficialmente compatible con Sails o Waterline directamente, pero dependiendo de su caso de uso hay un par de buenas soluciones para esto. Si su caso de uso es un puñado de conexiones dinámicas para fines de desarrollo (por ejemplo, en un complemento de recarga automática), y está dispuesto a vivir al límite, puede aprovechar una API privada como solución temporal a corto plazo. : sails.hook.orm.reload() . Sin embargo, definitivamente no desea usar eso en producción ya que literalmente elimina todo el ORM.

Si va a lidiar con un número mayor (digamos> 10 configuraciones únicas) de configuraciones de almacenamiento de datos dynamic en tiempo de ejecución durante la vida útil del proceso de Nodo en ejecución, esa es una historia diferente. En ese caso, recomendaría el uso del controlador en bruto relevante (por ejemplo, https://github.com/felixge/node-mysql ) para convocar / liberar esas conexiones dinámicas desde un grupo directamente a través de un servicio . Aún puede usar sus modelos normales en su aplicación para conexiones que son estáticas: simplemente será mejor que implemente conexiones de base de datos dinámicas por separado en su servicio. Por ejemplo, si estaba comstackndo una versión alojada de phpMyAdmin, podría usar un paquete NPM de nivel inferior para obtener dinámicamente información sobre las tablas de los usuarios, pero probablemente querría tener modelos de Account y Database que se refieran a tablas / colecciones almacenadas. en su propia base de datos.

Se está trabajando en una solución más integrada para Sails. Esta capacidad de aprovechar el ciclo de vida de la conexión sin formato y acceder a él desde la zona del usuario es un requisito previo para el soporte de transacciones incorporado, que es algo que esperamos que llegue a Sails / Waterline en algún momento de la segunda mitad de 2016. Mientras tanto, si usted encapsula su lógica para convocar / liberar conexiones a través de los métodos de servicio como se sugirió anteriormente, tendrá una solución funcional por ahora y su lógica de negocios debería estar más o menos preparada para el futuro (cuando realice una actualización, solo tendrá que intercambiar la Implementación en su servicio). ¡Espero que ayude!

He encontrado una solución para MySql DB

Importante: en mi caso, cambiaré la base de datos, pero todas las bases de datos tendrán la misma diferencia de esquema solamente en el nombre y los datos que contienen, y me aseguraré de agregar cualquier manejo de errores que necesite.

En config / connection.js ——– deshabilita la agrupación

  mysql_database: { adapter: 'sails-mysql', host: 'localhost', user: 'root', //optional password: '12345', //optional database: 'db1', //optional pool: false }, 

Ahora navega a

node_modules / sails-mysql / lib / connections / spawn.js

Añadir connectionObject.config = sails.SwitchDbConfig

 connectionObject.config = sails.SwitchDbConfig var conn = mysql.createConnection(connectionObject.config); conn.connect(function (err) { afterwards(err, conn); }); 

Ahora, por último, establezca sails.SwitchDbConfig desde cualquier lugar (servicio, controlador, etc.) como

 sails.SwitchDbConfig = { pool: false, connectionLimit: 5, waitForConnections: true, adapter: 'sails-mysql', host: 'localhost', user: 'root', password: '12345', database: sails.DB_NAME, identity: 'mysql_database' } 

Y, por último, si encuentra algo incorrecto que necesita ser actualizado … por favor haga ping