Supongamos el siguiente escenario:
Tenemos una clase que maneja una conexión Mongoose como se muestra a continuación:
export interface IInstance { name: string; instance: Mongoose.Mongoose; } export default class MongoHandler { public static instances: IInstance[] = [{ name: 'default', instance: null, }]; // Connect to mongo instance and add it to the instances array public static async connect(name: string, uri: string, options?: object): Promise<void> { const instance: Mongoose.Mongoose = await Mongoose.connect(uri, options); const newInstance: IInstance = { name, instance, }; MongoHandler.instances.push(newInstance); } // Returns the instance based on the name of instance public static getInstance(name: string = 'default'): Mongoose.Mongoose { return this.instances.find(instance => instance.name === name).instance; } } El otro módulo llamado CarModel usa el método getInstance() para crear un modelo:
export interface ICar { name: string; } const carSchema = new Mongoose.Schema<ICar>( { name: { type: String, required: true, }, } ); const carModel = MongoHandler.getInstance('default').model<ICar>('Car', carSchema, 'Cars'); export default carModel; Estamos usando carModel en un módulo llamado CarController .
En index.ts llamamos a estos dos módulos de la siguiente manera:
import const app = new App( [ MongoHandler.connect('default', process.env.MONGO_URI), ], [ new CarController(), ] );La aplicación es una clase para manejar el arranque rápido (se puede ignorar).
Al ejecutar este código, MongoHandler.getInstance('default') no está definido debido al orden de resolución de dependencia (creo). Y la resolución MongoHandler.getInstance('default') es seguida por MongoHandler.connect() que debe revertirse.
¿Como puedo resolver esto?
Saludos
Creo que hay 2 problemas en juego aquí, ninguno de los cuales tiene que ver con la resolución del módulo (que funcionará bien ya que no tiene dependencias circulares).
array.prototype.find devuelve la PRIMERA coincidencia encontrada, crea una instancia de la matriz de instancias con un objeto que coincide con el nombre predeterminado, pero no tiene ninguna instancia. Cuando se conecta, agrega otro objeto con el nombre predeterminado, pero este será el segundo en la lista, por lo tanto, find devolverá el objeto original, que tiene su objeto de instancia establecido como nulo. Aconsejaría eliminar este objeto de instancia vacío predeterminado por error y claridad del código.
su función de conexión hace uso de async-await. Pero nunca espera su función de conexión, por lo que no garantiza que su nueva instancia de conexión se haya realizado antes de llamar a getInstance dentro de su carController. Debe capturar la Promesa devuelta por la función de conexión y esperarla. Si no desea retrasar la instanciación de su CarController, puede guardar esta Promesa en MongoHandler y devolverla con alguna función de inicio que llame dentro de CarController para asegurarse de que la conexión se haya resuelto.