fix(core): dependencies not resolving for request-scoped lazy providers

This commit is contained in:
anizozina
2025-03-18 06:57:47 +09:00
parent 2d4b2c8a4c
commit 64eeb9bf00
5 changed files with 70 additions and 1 deletions

View File

@@ -0,0 +1,30 @@
import { INestApplication } from '@nestjs/common';
import { Test } from '@nestjs/testing';
import { expect } from 'chai';
import * as request from 'supertest';
import { LazyController } from '../src/lazy.controller';
describe('Lazy Requested Scoped providers', () => {
let app: INestApplication;
beforeEach(async () => {
const module = await Test.createTestingModule({
controllers: [LazyController],
}).compile();
app = module.createNestApplication();
await app.init();
});
it('should not recreate dependencies for default scope', async () => {
const resultOne = await request(app.getHttpServer()).get('/lazy/request');
expect(resultOne.text).to.be.equal('Hi! Counter is 1');
expect(resultOne.statusCode).to.be.equal(200);
const resultTwo = await request(app.getHttpServer()).get('/lazy/request');
expect(resultTwo.text).to.be.equal('Hi! Counter is 2');
expect(resultTwo.statusCode).to.be.equal(200);
});
});

View File

@@ -13,6 +13,16 @@ export class LazyController {
const { TransientService } = await import('./transient.service');
const _service = await moduleRef.resolve(TransientService);
return _service.eager();
}
@Get('request')
async execRequestScope() {
const { RequestLazyModule } = await import('./request.module');
const moduleRef = await this.lazyLoadModule.load(() => RequestLazyModule);
const { RequestService } = await import('./request.service');
const _service = await moduleRef.resolve(RequestService);
return _service.eager();
}
}

View File

@@ -0,0 +1,11 @@
import { Module } from '@nestjs/common';
import { EagerService } from './eager.module';
import { GlobalService } from './global.module';
import { RequestService } from './request.service';
@Module({
imports: [],
providers: [RequestService, GlobalService, EagerService],
exports: [RequestService],
})
export class RequestLazyModule {}

View File

@@ -0,0 +1,11 @@
import { Injectable, Scope } from '@nestjs/common';
import { EagerService } from './eager.module';
@Injectable({ scope: Scope.REQUEST })
export class RequestService {
constructor(private eagerService: EagerService) {}
eager() {
return this.eagerService.sayHello();
}
}

View File

@@ -255,7 +255,11 @@ export class Module {
}
const isAlreadyDeclared = this._providers.has(provider);
if (this.isTransientProvider(provider) && isAlreadyDeclared) {
if (
(this.isTransientProvider(provider) ||
this.isRequestScopeProvider(provider)) &&
isAlreadyDeclared
) {
return provider;
}
@@ -664,4 +668,7 @@ export class Module {
private isTransientProvider(provider: Type<any>): boolean {
return getClassScope(provider) === Scope.TRANSIENT;
}
private isRequestScopeProvider(provider: Type<any>): boolean {
return getClassScope(provider) === Scope.REQUEST;
}
}