ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

嵌套路由中如何传递参数?nest-router打造标准RESTful API完整指南

嵌套路由中如何传递参数?nest-router打造标准RESTful API完整指南 嵌套路由中如何传递参数?nest-router打造标准RESTful API完整指南【免费下载链接】nest-routerRouter Module For Nestjs Framework 项目地址: https://gitcode.com/gh_mirrors/ne/nest-routernest-router 是一款面向 NestJS 框架的路由模块Router Module它能帮你用一棵清晰的路由树来组织 API 路由。本指南将手把手讲解嵌套路由中如何传递参数通过:参数名语法把父级资源 ID 下沉到子模块控制器中让你快速搭建出规范、易维护的标准 RESTful API 一、nest-router 是什么为什么适合新手在传统 NestJS 项目中每个 Controller 都要手动写死完整前缀模块多了之后路由容易混乱。nest-router 的思路是给每个模块定义一个 path 前缀子模块自动继承父模块前缀从而天然形成层级化的 RESTful 路由结构。比如CatsModule挂在NinjaModule之下它的 Controller 前缀就不再是/cats而是/ninja/cats——这正是标准 RESTful 资源嵌套的核心形态。提示自 NestJSv8.0.0起该模块能力已被并入nestjs/core但仍可在 Nest 4.5.10 中使用本包。二、一键安装与路由树搭建步骤安装非常简单一条命令即可npm install nest-router --save接下来把所有路由集中定义在一个文件里推荐单独建routes.ts参考项目示例 routes.tsconst routes: Routes [ { path: /ninja, module: NinjaModule, children: [ { path: /cats, module: CatsModule }, { path: /dogs, module: DogsModule }, ], }, ];然后在根模块中导入即可见 app.module.tsModule({ imports: [RouterModule.forRoutes(routes), CatsModule, DogsModule, NinjaModule], }) export class ApplicationModule {}最终得到的路由树如下结构一目了然ninja ├── / ├── /katana ├── cats │ ├── / │ └── /ketty └── dogs ├── / └── /puppy路由的数据结构定义在 routes.interface.tspath、module、children三个字段就足以描述任意深度的路由树。三、嵌套路由中如何传递参数核心玩法这是本文的重点 ✅ 在标准 REST API 中子资源通常要携带父资源 ID例如某个忍者的猫就是/ninja/1/cats。3.1 在路由路径中声明 :参数名只需在子模块的path里加上:参数名前缀const routes: Routes [ { path: /ninja, module: NinjaModule, children: [ { path: /:ninjaId/cats, module: CatsModule }, { path: /:ninjaId/dogs, module: DogsModule }, ], }, ];这样ninjaId就会自动成为CatsModule、DogsModule内所有路由的一部分。3.2 在控制器中用 Param() 读取参数在子模块的控制器方法里用 NestJS 的Param()装饰器取值即可Controller() export class CatsController { Get(/) findAll(Param(ninjaId) ninjaId: string) { return 忍者 ${ninjaId} 的猫列表; } }参数在整条路径中只会声明一次子层级无需重复定义这是嵌套路由传参最优雅的地方。3.3 进阶用 Pipe 把 ID 转成完整对象拿到ninjaId之后还可以挂一个 Type Validation/Transformation Pipe把字符串 ID 自动转换成数据库里的 Ninja 实体控制器里直接拿到对象代码更干净。四、最快解析控制器完整路径resolvePath 方法中间件绑定 Controller 时NestJS 默认不会识别模块前缀MODULE_PATH 元数据。nest-router 提供了RouterModule.resolvePath()帮你解析完整路径核心实现在 router.module.ts// ❌ 前缀缺失 consumer.apply(someMiddleware).forRoutes(SomeController); // ✅ 自动拼上模块前缀 consumer.apply(someMiddleware).forRoutes(RouterModule.resolvePath(SomeController));项目中LoggerMiddleware的使用示例可以参考 app.module.ts 与 logger.middleware.ts。五、关键源码与项目结构导读 文件作用src/router.module.tsRouterModule核心forRoutes、resolvePathsrc/routes.interface.tsRoute/Routes类型定义src/utils/flat-routes.util.ts递归展平路由树拼接父子前缀src/utils/validate-path.util.ts路径规范化补齐/、去除重复斜杠examples/nest-v5x/src/Nest 5.x 完整示例工程展平逻辑的关键点递归遍历children时把子path与父path拼接父前缀 子路径再写入模块的MODULE_PATH元数据NestJS 后续据此为控制器生成最终路由。六、最佳实践清单路由集中管理所有routes放在独立文件如routes.ts避免散落各处参数命名语义化用:userId/cats/:catId这类资源名命名RESTful 风格清晰配合 Pipe 校验对数字型 ID 使用ParseIntPipe或自定义 Pipe提前拦截非法参数多层嵌套同样适用children支持任意深度每一层都能携带自己的参数升级注意NestJS 8 用户可直接使用官方内置能力API 与本包高度一致按以上步骤你就掌握了 nest-router 在嵌套路由中传递参数的完整用法可以轻松搭建出结构清晰、符合 RESTful 规范的 API 项目 【免费下载链接】nest-routerRouter Module For Nestjs Framework 项目地址: https://gitcode.com/gh_mirrors/ne/nest-router创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表