如何在NestJS中为每个新的HTTP请求使用新实例?

问题描述 投票:1回答:1

我有一个API,并试图发送请求。这是有效的,但我注意到,在收到回复后,课程没有被销毁。我现在正在使用nestJS,但当我尝试测试时,nodeJS + expressJS也遇到了这个问题。

我正在使用以下代码:

@Injectable()
export class UsersService {
    s = '';

    constructor() {}

    async findAll(): Promise<any> {
        this.s += ' haha ';
        return await this.s;
    }
}

这第二次返回haha haha haha,依此类推。

我不确定这是否是所期望的行为或者可能没有正确配置,因为我现在只是在学习nestJS。我之前曾使用过Zend Framework,但没有显示出这种行为。

任何指导将不胜感激。

谢谢。

javascript node.js typescript express nestjs
1个回答
2
投票

随着nest.js 6.0的发布,添加了injection scopes。有了这个,您可以为您的提供商选择以下三个范围之一:

  • SINGLETON:默认行为。您的提供程序的一个实例用于整个应用程序
  • TRANSIENT:为每个注入它的提供者创建一个专用的提供者实例。
  • 请求:对于每个请求,都会创建一个新的提供者。警告:此行为将在您的依赖关系链中冒出来。示例:如果UsersController(Singleton)注入注入OtherService(Request)的UsersService(Singleton),则UsersController和UsersService将自动成为请求范围。

Usage

将它添加到@Injectable()装饰器:

@Injectable({ scope: Scope.REQUEST })
export class UsersService {}

或者在模块定义中为自定义提供程序设置它:

{
  provide: 'CACHE_MANAGER',
  useClass: CacheManager,
  scope: Scope.TRANSIENT,
}

您正在寻找的是请求范围的提供商。在nest v5中不支持它们,请参阅this issue。至于现在,所有提供者都是单身人士。

虽然他们添加了这个pull request,并且将成为nest v6的一部分。使用新版本,我们将获得瞬态和按请求范围。

© www.soinside.com 2019 - 2024. All rights reserved.