路由模块
提示
本章仅适用于基于 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 注册为 DashboardModule 和 MetricsModule 的父模块。
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。