He estado trabajando en una aplicación (Node.js con MongoDB usando mongoose), y el servidor se conecta a 2 bases de datos diferentes, 1 genérico que contiene pares de nombre de usuario y contraseña para la autenticación del usuario. Luego, cuando el usuario inicia sesión, quiero conectarme a una base de datos diferente, con el nombre del ID de usuario del usuario. Logré crear un módulo para compartir la base de datos genérica de UA, pero es más difícil con el segundo, ya que no se abre con la conexión, sino más adelante, cuando el usuario inicia sesión. Supongo que me inspiré en la idea. de reaccionar contexto tipo de intercambio.
Hasta ahora tengo algo como esto
const mongoose = require("mongoose"); /* UA = User Authentication US = User Specific DB = DataBase */ const UA_DB = mongoose.createConnection(/*...*/); ); const User = UA_DB.model("User", require("../../data-schemas/user")); let US_DB, Order, Item, Ingredient, Place; console.log("opened UA database"); function sendUserId(newUserId) { userId = newUserId; US_DB = mongoose.createConnection(/*... ${newUserId} ...*/ ); Order = US_DB.model("Order", require("../../data-schemas/order")); Item = US_DB.model("Item", require("../../data-schemas/item")); Ingredient = US_DB.model( "Ingredient", require("../../data-schemas/ingredient") ); Place = US_DB.model("Place", require("../../data-schemas/place")); console.log("opened US database"); } module.exports = { UA_DB: { User, }, US_DB: { Order, Item, Ingredient, Place, }, sendUserId, };Ahora, si no lo hubiera dejado claro, el primero, UA_DB funciona bien, el usuario inicia sesión bien... Cuando se trata de US_DB, siempre obtengo valores indefinidos (no se puede leer la propiedad 'buscar' de indefinido) . Sospecho que el problema podría ser que el valor exportado no se actualiza con el valor de las variables. ¿Alguna idea, cómo podría solucionarse esto?
Bueno, lo descubrí. En lugar de usar valores precisos, uso una función para devolverlos y para conectarme a la base de datos. El ID de usuario se almacena en un token, así que después de la verificación verifico si ya estoy conectado a la base de datos correcta (con la variable de ID de usuario, que almacena valores) y luego devolver los valores actuales de los modelos ahora mi código se parece a esto
const mongoose = require("mongoose"); /* UA = User Authentication US = User Specific DB = DataBase */ const UA_DB = mongoose.createConnection(/* ... */ ); const User = UA_DB.model("User", require("../../data-schemas/user")); let US_DB, Order, Item, Ingredient, Place = "some default value"; console.log("opened UA database"); let userId = ""; function getUS_DBModels(newUserId) { if (newUserId !== userId) { userId = newUserId; US_DB = mongoose.createConnection(`...${userId}...` ); Order = US_DB.model("Order", require("../../data-schemas/order")); Item = US_DB.model("Item", require("../../data-schemas/item")); console.log("opened a US_DB connection"); Ingredient = US_DB.model( "Ingredient", require("../../data-schemas/ingredient") ); Place = US_DB.model("Place", require("../../data-schemas/place")); } return { Order, Item, Ingredient, Place } } module.exports = { UA_DB: { User, }, getUS_DBModels, };Para quien se lo pregunte, en diferentes módulos se puede acceder a valores como este
const dbHandler = require("./path/to/the/module"); const { Item } = dbHandler.getUS_DBModels("UserId");