请求范围服务

时间:2018-11-23 16:24:40

标签: javascript node.js typescript nestjs

据我了解,当应用程序启动时,nestjs会创建所有服务,也许我使用的是错误的,有没有一种方法可以配置NestJs根据请求创建服务?像每次执行请求一样,都会重新创建用于该请求的某些服务?

3 个答案:

答案 0 :(得分:1)

更新1月19日

这将在nest.js 6.0中实现,请参见此pull request


正如卡米尔(Kamil)在此issue中写道:

  

一旦异步钩子功能(在节点10中仍处于试验状态)为   稳定,我们将考虑为   请求范围的实例。

因此,目前看来这还不可能。与默认的单例行为相比,您只能将整个模块标记为SingleScope。使用SingleScope,将为每次导入创建模块的新实例。

答案 1 :(得分:1)

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

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

用法

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

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

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

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

答案 2 :(得分:0)

  

我想使用di来标记整个端点以在   交易而不必为   端点。除了使用di之外,还有一个软件包可以帮助我们   根据称为cls-hooked的回调链创建资源   基于金·克恩(Kim Kern)在回应中async-hooks使用的   我可以在调用enpoint时启动事务,   设置完成后停止它,因为我将typeorm用作数据库orm   能够使用this solution