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
相关产品推荐
相关产品推荐

