有几种方式来挂载 Nest 应用程序。您可以创建 Web 应用程序、微服务或仅仅是一个裸露的 Nest 独立应用程序(没有任何网络监听器)。Nest 独立应用程序是围绕 Nest IoC 容器的包装器,它持有所有实例化的类。我们可以直接使用独立应用程序对象从任何导入的模块中获取对任何现有实例的引用。因此,您可以在任何地方利用 Nest 框架,包括例如脚本化的 CRON 作业。您甚至可以在其上构建 CLI。
要创建 Nest 独立应用程序,请使用以下构造:
独立应用程序对象允许您获取在 Nest 应用程序中注册的任何实例的引用。让我们假设我们在 TasksModule
模块中有一个 TasksService
提供者,该模块由我们的 AppModule
模块导入。这个类提供了一组我们想要从 CRON 作业中调用的方法。
要访问 TasksService
实例,我们使用 get()
方法。get()
方法就像一个查询,在每个注册的模块中搜索实例。您可以将任何提供者的令牌传递给它。或者,为了严格的上下文检查,传递一个带有 strict: true
属性的选项对象。启用此选项后,您必须导航通过特定模块以从选定的上下文中获取特定实例。
以下是从独立应用程序对象检索实例引用的可用方法摘要。
info 提示 在非严格模式下,默认选择根模块。要选择任何其他模块,您需要手动导航模块图,逐步进行。
请记住,独立应用程序没有任何网络监听器,因此任何与 HTTP 相关的 Nest 功能(例如,中间件、拦截器、管道、守卫等)在此上下文中都不可用。
例如,即使您在应用程序中注册了全局拦截器,然后使用 app.get()
方法检索控制器的实例,拦截器也不会被执行。
当处理动态模块时,我们应该提供与在应用程序中注册的动态模块相同的对象给 app.select
。例如:
然后您可以稍后选择该模块:
如果您希望 Node 应用程序在脚本完成后关闭(例如,对于运行 CRON 作业的脚本),您必须在 bootstrap
函数的末尾调用 app.close()
方法,如下所示:
如生命周期事件章节中所述,这将触发生命周期钩子。
完整的工作示例可在这里找到。