独立应用程序 Standalone applications

导读

有几种方法可以安装 Nest 应用程序。您可以创建一个 Web 应用程序、一个微服务或只是一个裸 Nest 独立应用程序(没有任何网络侦听器)。Nest 独立应用程序是 Nest IoC 容器的包装器,它包含所有实例化的类。我们可以直接从任何导入的模块中使用独立应用程序对象获取对任何现有实例的引用。因此,您可以在任何地方利用 Nest 框架,例如,包括脚本化的 CRON 作业。您甚至可以在其上构建 CLI

入门

要创建 Nest 独立应用程序,请使用以下构造:

ts
async function bootstrap() {
  const app = await NestFactory.createApplicationContext(AppModule)
  // your application logic here ...
}
bootstrap()

从静态模块检索提供程序

独立应用程序对象允许您获取对 Nest 应用程序内注册的任何实例的引用。假设我们在 TasksModule 模块中有一个 TasksService 提供程序,该提供程序由我们的 AppModule 模块导入。此类提供了一组我们想要从 CRON 作业中调用的方法。

ts
const taskService = app.get(TasksService)

要访问 TasksService 实例,我们使用 get() 方法。get() 方法的作用类似于查询,在每个注册模块中搜索实例。您可以将任何提供程序的令牌传递给它。或者,对于严格的上下文检查,传递具有 strict: true 属性的选项对象。使用此选项,您必须浏览特定模块以从选定的上下文中获取特定实例。

ts
const taskService = app.select(TasksModule).get(TasksService, { strict: true })

以下是从独立应用程序对象中检索实例引用的可用方法的摘要。

get()检索应用程序上下文中可用的控制器或提供程序(包括保护、过滤器等)的实例。
select()浏览模块图以提取所选模块的特定实例(与上述严格模式一起使用)。
提示

在非严格模式下,默认选择根模块。要选择任何其他模块,您需要逐步手动浏览模块图。

从动态模块中检索提供程序

处理 动态模块 时,我们应该向 app.select 提供表示应用程序中已注册动态模块的相同对象。例如:

ts
export const dynamicConfigModule = ConfigModule.register({ folder: './config' })

@Module({
  imports: [dynamicConfigModule],
})
export class AppModule {}

然后,您可以稍后选择该模块:

ts
const configService = app.select(dynamicConfigModule).get(ConfigService, { strict: true })

终止阶段

如果您希望 Node 应用程序在脚本完成后关闭(例如,对于运行 CRON 作业的脚本),则必须在bootstrap函数末尾调用app.close()方法,如下所示:

ts
async function bootstrap() {
  const app = await NestFactory.createApplicationContext(AppModule)
  // application logic...
  await app.close()
}
bootstrap()

正如生命周期事件一章中提到的,这将触发生命周期钩子。

Example

此处提供了一个工作示例。