Skip to content

路由模块

提示

本章仅适用于基于 HTTP 的应用。

在一个 HTTP 应用中(例如 REST API),某个处理器的路由路径由以下两部分拼接而成:控制器上声明的(可选)前缀(位于 @Controller 装饰器中),以及方法装饰器中指定的路径(例如 @Get('users'))。你可以在这一节中了解更多。除此之外,你还可以为应用中注册的所有路由定义一个全局前缀,或者启用版本控制

此外,在一些边界场景中,在模块级别定义前缀(从而作用于该模块中注册的所有控制器)会非常有用。 例如,假设一个 REST 应用暴露了若干不同端点,而这些端点都服务于应用中的某个特定部分,名为 “Dashboard”。 这种情况下,你无需在每个控制器里重复 /dashboard 前缀,而是可以使用一个实用模块 RouterModule,如下所示:

typescript
@Module({
  imports: [
    DashboardModule,
    RouterModule.register([
      {
        path: 'dashboard',
        module: DashboardModule,
      },
    ]),
  ],
})
export class AppModule {}

提示

RouterModule 类从 @nestjs/core 包中导出。

除此之外,你还可以定义层级结构。这意味着每个模块都可以拥有 children 模块。 子模块会继承其父模块的前缀。在下面的示例中,我们会将 AdminModule 注册为 DashboardModuleMetricsModule 的父模块。

typescript
@Module({
  imports: [
    AdminModule,
    DashboardModule,
    MetricsModule,
    RouterModule.register([
      {
        path: 'admin',
        module: AdminModule,
        children: [
          {
            path: 'dashboard',
            module: DashboardModule,
          },
          {
            path: 'metrics',
            module: MetricsModule,
          },
        ],
      },
    ])
  ],
});

提示

这个特性需要非常谨慎地使用,因为过度使用会让代码随着时间推移变得难以维护。

在上面的例子中,任何注册在 DashboardModule 中的控制器都会额外拥有 /admin/dashboard 前缀(因为模块会自上而下递归地拼接路径,即从父模块到子模块)。 同样,定义在 MetricsModule 中的每个控制器也都会拥有额外的模块级前缀 /admin/metrics

基于 NestJS 官方文档翻译