NestJS中@Get()路由调换顺序后固定路径匹配异常如何处理?
问题根本原因
NestJS 底层基于 Express/Fastify 框架,路由匹配严格按照代码定义的先后顺序执行,只要匹配到第一个符合规则的路由就会直接执行对应的处理方法,不会继续匹配后续路由。
你代码里的@Get(':id')属于动态参数路由,会匹配/vehicle/路径后接任意字符串的请求,当你把它放在@Get('availableVehicles')前面时,请求/vehicle/availableVehicles会被框架判定为id = 'availableVehicles',直接命中动态路由,永远不会走到后面的精确路由。
解决方案
有两种常用的解决方式:
方式一:调整路由定义顺序(最常用、成本最低)
始终把精确匹配的路由放在动态参数路由的前面,就是你最初的写法即可:
@Controller('vehicle') export class VehicleController { constructor( private readonly vehicleService: VehicleService, private readonly crudService: CurdService ) { } tableName: string = 'vehicle'; // 先写精确路由 @Get('availableVehicles') async availableVehicles() { return await this.vehicleService.availableVehicles(); } // 动态参数路由放最后 @Get(':id') async getbyId(@Req() request: Request) { return await this.crudService.getById(this.tableName, request.params.id); } }
方式二:给动态参数加正则约束
如果你的id参数固定为数字格式,可以给动态路由参数添加正则校验,只有符合规则的参数才会命中该路由,就算顺序调换也不会冲突:
// 限制id必须为数字,availableVehicles是字符串就不会匹配该路由 @Get(':id(\\d+)') async getbyId(@Req() request: Request) { return await this.crudService.getById(this.tableName, request.params.id); } @Get('availableVehicles') async availableVehicles() { return await this.vehicleService.availableVehicles(); }
内容的提问来源于stack exchange,提问作者Freedom Rider
相关产品推荐
相关产品推荐

