代码之家  ›  专栏  ›  技术社区  ›  Sanju

如何为nestjs中的每个新http请求使用新实例?

  •  0
  • Sanju  · 技术社区  · 6 年前

    我有一个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合作过,它没有显示这种行为。

    任何指导都将不胜感激。

    谢谢您。

    0 回复  |  直到 6 年前
        1
  •  1
  •   Kim Kern    6 年前

    随着nest.js 6.0的发布, injection scopes 已添加。使用此选项,可以为提供程序选择以下三个作用域之一:

    • 单重态 :默认行为。提供程序的一个实例用于整个应用程序
    • 瞬变的 :将为注入它的每个提供程序创建提供程序的专用实例。
    • 请求 :为每个请求创建一个新的提供程序。注意:这种行为会在依赖链中冒泡。示例:如果userscontroller(singleton)注入注入otherservice(request)的usersservice(singleton),那么userscontroller和usersservice都将自动成为请求范围。

    用法

    或者添加到 @Injectable() 装饰工:

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

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

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

    您要查找的是请求范围的提供程序。Nest V5不支持它们,请参见 this issue . 到目前为止,所有的提供者都是单例的。

    加上这个 pull request 不过,它将是NestV6的一部分。在新版本中,我们将获得临时和每个请求的作用域。