NestJS带ID的/:id/video路由返回404问题求助
解决NestJS中
/:id/video路由返回404的问题 嘿,我来帮你排查这个路由问题!你的核心问题出在NestJS的路由匹配顺序上,下面给你拆解原因和解决办法:
问题根源
NestJS的路由匹配是从上到下依次检查的,你的控制器里@Get('/:id')这个路由是一个通用的动态参数路由,它会匹配所有/channel/xxx格式的请求——包括你想发给/:id/video的/channel/3/video,因为NestJS会把3/video整个当成id参数的值,直接命中findOne方法,后面的@Get('/:id/video')路由根本没机会被匹配到,所以返回404。
解决办法
你可以选下面两种方案中的一种:
方案1:调整路由顺序,把具体路由放在前面
把@Get('/:id/video')的方法移到@Get('/:id')方法的上方,这样NestJS会先检查更具体的路由,匹配到/channel/3/video时就会直接走findVideosByChannelId方法:
@Controller('channel') export class ChannelController extends CrudController<Channel> { constructor( private readonly channelService: ChannelService, private readonly videoService: VideoService ) { super(channelService); } @Get() async findAll(@Query() params): Promise<Pagination<Channel>> { return this.channelService.findAll({take: params.take, skip: params.skip, relations: ['language']}); } // 把具体路由放在通用路由前面 @Get('/:id/video') async findVideosByChannelId(@Param('id') id) { // 这里建议改成调用videoService的方法,比如return this.videoService.findByChannelId(id); return this.channelService.findOne({where: {id}, relations: ['language']}); } @Get('/:id') async findOne(@Param('id') id) { // 这里要注意:你之前的findOne没传id参数,会导致查询错误,需要加上where条件 return this.channelService.findOne({where: {id}, relations: ['language']}); } }
方案2:给动态参数添加路由约束
如果你不想调整方法顺序,可以给id参数添加正则约束,限定它只能是数字(或你需要的格式),这样/:id就不会匹配3/video这种包含斜杠的路径了:
// 用正则\\d+限定id只能是数字 @Get('/:id(\\d+)') async findOne(@Param('id') id) { return this.channelService.findOne({where: {id}, relations: ['language']}); }
额外小提示
你的findOne方法里调用channelService.findOne时没有传递id参数,会导致查询不到正确的数据,记得加上where: {id}条件哦~
内容的提问来源于stack exchange,提问作者Andurit
相关产品推荐
相关产品推荐

