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

2024-02-14

我有一个 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,但没有显示此行为。

任何指导将不胜感激。

谢谢。


随着nest.js 6.0的发布,注射范围 https://docs.nestjs.com/providers#scopes添加。这样,您可以为您的提供商选择以下三个范围之一:

  • 单例:默认行为。您的提供者的一个实例用于整个应用程序
  • 短暂的:为每个注入它的提供程序创建一个专用的提供程序实例。
  • REQUEST:对于每个请求,都会创建一个新的提供者。注意:此行为将在您的依赖链中出现。示例:如果 UsersController (Singleton) 注入 UsersService (Singleton),而 UsersService (Singleton) 又注入 OtherService (Request),则 UsersController 和 UsersService 都将自动成为请求范围。

Usage

要么将其添加到@Injectable()装饰器:

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

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

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

您正在寻找的是请求范围内的提供商。 Nest v5 不支持它们,请参阅这个问题 https://github.com/nestjs/nest/issues/1376。就目前而言,所有提供者都是单例。

他们被添加了这个拉取请求 https://github.com/nestjs/nest/pull/1405不过,它将成为 Nest v6 的一部分。在新版本中,我们将获得瞬态和每个请求的范围。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐