From 91b6fafe8814ca270d56a6e929e7e79fb4a4cc54 Mon Sep 17 00:00:00 2001 From: Steven Tsang Date: Sat, 14 May 2022 20:44:53 +0800 Subject: [PATCH] fix: ensure correct application shutdown with forRootAsync and multiple databases (#75) * When using `forRootAsync` module with multiple databases on application shutdown it fails to find MikroORM and causes a shutdown error. * undo yarn.lock changes * make sure contextName is set for the orm Co-authored-by: Steven Tsang --- src/mikro-orm.providers.ts | 10 +++++++--- tests/mikro-orm.middleware.test.ts | 8 +++++--- tests/mikro-orm.module.test.ts | 8 ++++++-- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/mikro-orm.providers.ts b/src/mikro-orm.providers.ts index 8244799..86cec02 100644 --- a/src/mikro-orm.providers.ts +++ b/src/mikro-orm.providers.ts @@ -25,8 +25,7 @@ export function createMikroOrmProvider(contextName?: string): Provider { options = config as unknown as MikroOrmModuleOptions; } - const mergedOptions = !options.contextName && contextName ? { ...options, contextName } : options; - return MikroORM.init(mergedOptions); + return MikroORM.init(options); }, inject: [MIKRO_ORM_MODULE_OPTIONS], }; @@ -49,7 +48,12 @@ export function createMikroOrmAsyncOptionsProvider(options: MikroOrmModuleAsyncO if (options.useFactory) { return { provide: MIKRO_ORM_MODULE_OPTIONS, - useFactory: options.useFactory, + useFactory: (...args: any[]) => { + const factoryOptions = options.useFactory!(...args); + return options.contextName + ? { contextName: options.contextName, ...factoryOptions } + : factoryOptions; + }, inject: options.inject || [], }; } diff --git a/tests/mikro-orm.middleware.test.ts b/tests/mikro-orm.middleware.test.ts index ff54847..e6f6cba 100644 --- a/tests/mikro-orm.middleware.test.ts +++ b/tests/mikro-orm.middleware.test.ts @@ -42,10 +42,12 @@ class TestController { @Module({ imports: [ - MikroOrmModule.forRoot({ + MikroOrmModule.forRootAsync({ contextName: 'database1', - registerRequestContext: false, - ...testOptions, + useFactory: () => ({ + registerRequestContext: false, + ...testOptions, + }), }), MikroOrmModule.forRoot({ contextName: 'database2', diff --git a/tests/mikro-orm.module.test.ts b/tests/mikro-orm.module.test.ts index 4cbdea8..4d58162 100644 --- a/tests/mikro-orm.module.test.ts +++ b/tests/mikro-orm.module.test.ts @@ -23,11 +23,12 @@ class ConfigService implements MikroOrmOptionsFactory { constructor(@Inject('my-logger') private readonly logger: Logger) { } createMikroOrmOptions(contextName?: string): Options { - return { - contextName, + const options = { ...testOptions, logger: this.logger.log.bind(this.logger), }; + + return contextName ? { contextName, ...options } : options; } } @@ -105,6 +106,7 @@ describe('MikroORM Module', () => { const orm = module.get(MikroORM); expect(orm).toBeDefined(); + expect(orm.config.get('contextName')).toBe('default'); expect(module.get(EntityManager)).toBeDefined(); await orm.close(); }); @@ -119,6 +121,7 @@ describe('MikroORM Module', () => { const orm = module.get(MikroORM); expect(orm).toBeDefined(); + expect(orm.config.get('contextName')).toBe('default'); expect(module.get(EntityManager)).toBeDefined(); await orm.close(); }); @@ -137,6 +140,7 @@ describe('MikroORM Module', () => { const orm = module.get(MikroORM); expect(orm).toBeDefined(); + expect(orm.config.get('contextName')).toBe('default'); expect(module.get(EntityManager)).toBeDefined(); await orm.close(); });