mirror of
https://github.com/nestjs/nest.git
synced 2026-02-21 15:08:37 +00:00
fix(core): dependencies not resolving for request-scoped lazy providers
This commit is contained in:
@@ -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);
|
||||
});
|
||||
});
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
11
integration/lazy-modules/src/request.module.ts
Normal file
11
integration/lazy-modules/src/request.module.ts
Normal 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 {}
|
||||
11
integration/lazy-modules/src/request.service.ts
Normal file
11
integration/lazy-modules/src/request.service.ts
Normal 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();
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user