Nestjs请求和应用程序生命周期

时间:2018-08-06 12:11:15

标签: nestjs

我正在寻找有关NestJS框架的请求和应用程序生命周期的信息。具体来说:

  1. 在以下请求中,对于以下实现的路由,以下过程的执行顺序是什么:中间件,管道,防护,拦截器和任何其他可能的请求过程

  2. NestJS应用程序中模块和提供程序的寿命是多少?它们会在请求,应用程序或其他内容的生命周期中持续存在吗?

  3. 除了OnModuleInit和OnModuleDestroy之外,还有生命周期挂钩吗?

  4. 是什么导致Modeule被破坏(并触发OnModuleDestroy事件)?

2 个答案:

答案 0 :(得分:2)

  

在以下请求中,对于以下实现的路由,以下过程的执行顺序是什么:中间件,管道,防护,拦截器和任何其他可能的请求过程

常见顺序是:

  • 中间件
  • 卫兵
  • 拦截器(在操纵流之前)
  • 管道
  • 拦截器(在操纵流之后)
  • 异常过滤器(如果捕获到任何异常)
  

NestJS应用程序中模块和提供程序的寿命是多少?它们会在请求,应用程序或其他内容的生命周期中持续存在吗?

它们在应用程序的生命周期中一直有效。关闭NestApplication或NestMicroservice时,模块将被销毁(请参阅close中的INestApplication方法)。

  

除了OnModuleInit和OnModuleDestroy之外,还有生命周期挂钩吗?

暂时没有。

  

是什么导致Modeule被破坏(并触发OnModuleDestroy事件)?

请参阅我对第二点的回答。当您对生命周期挂钩感兴趣时,您可能会对问题#938#550

感兴趣

答案 1 :(得分:0)

  

在以下请求中,对于以下实现的路由,以下过程的执行顺序是什么:中间件,管道,防护,拦截器和任何其他可能的请求过程

中间件->防护->拦截器(next.handle()之前的代码)->管道->路由处理程序->拦截器(例如:next.handle().pipe( tap(() => changeResponse()) ))->异常过滤器(如果引发异常)

使用这三个函数,您可以在其构造函数中注入其他依赖项(例如服务,...)。

  

NestJS应用程序中模块和提供程序的寿命是多少?它们会在请求,应用程序或其他内容的生命周期中持续存在吗?

提供者可以具有以下任意范围:

SINGLETON-提供程序的单个实例在整个应用程序中共享。实例生存期与应用程序生命周期直接相关。应用程序启动后,所有单例提供程序都将实例化。默认情况下使用Singleton范围。

REQUEST-专门为每个传入请求创建提供者的新实例。请求完成处理后,实例将被垃圾回收。

TRANSIENT-临时提供程序未在使用者之间共享。每个注入临时提供程序的使用者都将收到一个新的专用实例。

在大多数情况下,建议使用单例作用域。在使用者和请求之间共享提供程序意味着在应用程序启动期间,实例可以被缓存并且实例初始化仅发生一次。

示例

import { Injectable, Scope } from '@nestjs/common';

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

除了OnModuleInit和OnModuleDestroy之外,还有生命周期挂钩吗?

OnApplicationBootstrap-在应用程序完全启动并引导后调用 OnApplicationShutdown-响应系统信号(当应用程序因SIGTERM而关闭时)。使用此挂钩可以正常关闭Nest应用程序。此功能通常与Kubernetes,Heroku或类似服务一起使用。

OnModuleInitOnApplicationBootstrap钩子都允许您推迟应用程序初始化过程(返回Promise或将方法标记为异步)。

  

是什么导致模块被破坏(并触发OnModuleDestroy事件)?

通常来自Kubernetes,Heroku或类似服务的关闭信号。