You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 08:18:03