【问题标题】:How to use new instance for every new HTTP request in NestJS?如何为 NestJS 中的每个新 HTTP 请求使用新实例?
【发布时间】:2019-07-30 16:29:35
【问题描述】:

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

任何指导将不胜感激。

谢谢。

【问题讨论】:

  • 按照设计,可注入实例是单例,就像在许多 IOC 框架(例如 Spring)中一样。如果您想使用一些缓存机制,这实际上很有用。你为什么要不然?适用于哪个用例?

标签: javascript node.js typescript express nestjs


【解决方案1】:

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

  • SINGLETON:默认行为。您的提供程序的一个实例用于整个应用程序
  • TRANSIENT:为注入它的每个提供程序创建一个专用的提供程序实例。
  • REQUEST:对于每个请求,都会创建一个新的提供者。注意:这种行为会在你的依赖链中冒泡。示例:如果 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 添加的,但它们将成为 Nest v6 的一部分。在新版本中,我们将获得瞬态和按请求的范围。

【讨论】:

  • 在nest 发布该功能之前,您是否可以提出任何替代方案来实现此行为?
  • 您始终可以自己实例化服务,而不依赖于依赖注入,例如直接在路由方法中:const requestScopedService = new MyService(databaseConnection);
猜你喜欢
  • 2015-04-16
  • 1970-01-01
  • 2017-10-02
  • 2012-01-04
  • 2020-06-04
  • 1970-01-01
  • 2014-03-09
  • 2021-10-17
  • 1970-01-01
相关资源
最近更新 更多