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

NestJS按任务名称搜索接口报ObjectId转换错误求助

问题分析与解决方案:NestJS搜索接口返回500错误(ObjectId转换失败)

错误原因

  1. 路由匹配顺序冲突:NestJS的路由匹配遵循代码定义的先后顺序。你先定义了@Get(':id')动态路由,后定义@Get('search')固定路由。当请求/tasks/search时,Nest会优先把search识别为id参数,将请求转发到getOne方法,而非预期的search方法。
  2. 类型转换失败:getOne方法接收的id参数类型为ObjectId,但字符串search无法转换为有效的MongoDB ObjectId,触发类型转换异常,最终返回500错误。

解决方案

将@Get('search')路由调整到@Get(':id')之前,让Nest先匹配固定路径的搜索接口,再处理动态ID的请求。

修改后的TasksController代码:

@Controller('tasks')
export class TasksController {
  constructor(private readonly tasksService: TasksService) {}

  @Post()
  @HttpCode(HttpStatus.CREATED)
  @Header('Cache-Control', 'none')
  create(@Body() createTasks: CreateTasksDto): Promise<Task> {
    return this.tasksService.create(createTasks);
  }

  @Get()
  getAll() {
    console.log('Work');
    return this.tasksService.getAll();
  }

  // 把search路由移到动态:id路由之前
  @Get('search')
  search(@Query('query') query: string): Promise<Task[]> {
    return this.tasksService.search(query);
  }

  @Get(':id')
  getOne(@Param('id') id: ObjectId) {
    return this.tasksService.getOne(id);
  }

  @Delete(':id')
  remove(@Param('id') id: ObjectId) {
    return this.tasksService.remove(id);
  }

  @Put(':id')
  update(@Body() updateTask: UpdateTasksDto, @Param('id') id: string) {
    return this.tasksService.update(updateTask, id);
  }
}

额外注意事项

  • 正确的请求路径:由于控制器前缀是tasks,搜索接口的正确路径应为 http://localhost:3000/tasks/search?query=你的关键词,http://localhost:3000/search不在当前控制器的路由范围内,会返回404。
  • 参数校验优化:可以给query参数添加非空校验,避免空值导致正则匹配异常:
    import { ParseStringPipe } from '@nestjs/common';
    
    // ...
    @Get('search')
    search(@Query('query', new ParseStringPipe({ optional: false })) query: string): Promise<Task[]> {
      return this.tasksService.search(query);
    }
    

内容的提问来源于stack exchange,提问作者Anatoliy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:06:34