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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 09:47:46