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

NestJS控制器无法捕获服务抛出的错误问题排查

问题原因及解决方案

核心问题

你的控制器调用异步方法时没有使用await,导致try/catch无法捕获异步抛出的错误。

CompaniesService.uploadFiles是async方法,调用它会返回一个Promise。如果不添加await,代码会直接跳过异步逻辑继续执行(所以你会看到didn't get error输出),而异步方法里抛出的错误会变成未处理的Promise拒绝,直接终止Node.js进程,Nest的默认异常过滤器根本没机会介入处理。

修复代码

只需要修改控制器的uploadFiles方法,增加async关键字并在调用服务方法时加await:

// companies.controller.ts
@Controller("company")
export class CompaniesController {
  constructor(private companiesService: CompaniesService) {}

  @Post("/:id/upload")
  @UseInterceptors(FilesInterceptor("file"))
  // 1. 添加async关键字
  async uploadFiles(
    @Param("id") id: string,
    @UploadedFiles() files: Array<Express.Multer.File>,
  ) {
    try {
      // 2. 调用服务方法时加await
      await this.companiesService.uploadFiles(id, files);
      console.log("didn't get error");
    } catch (error) {
      console.log("got error");
      throw new HttpException("forbidden", HttpStatus.FORBIDDEN);
    }
  }
}

额外说明

  • 添加await后,异步方法的错误会被try/catch捕获,此时Nest的异常过滤器也能正常工作,返回对应的HTTP状态码。
  • 如果你不想用try/catch,也可以直接返回Promise,让Nest自己处理异常(Nest会自动捕获Promise的拒绝并交给异常过滤器):
async uploadFiles(
  @Param("id") id: string,
  @UploadedFiles() files: Array<Express.Multer.File>,
) {
  // 直接返回Promise,异常会被Nest自动处理
  await this.companiesService.uploadFiles(id, files);
  console.log("didn't get error");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:50:34