【问题标题】:NestJS not handling error from thrown from service in controllerNestJS 不处理控制器中服务抛出的错误
【发布时间】:2023-01-20 04:14:02
【问题描述】:

我有一个简单的设置,我从控制器调用服务方法,如下所示:

// companies.controller.ts

@Controller("company")
export class CompaniesController {
  constructor(private companiesService: CompaniesService) {}

  @Post("/:id/upload")
  @UseInterceptors(FilesInterceptor("file"))
  uploadFiles(
    @Param("id") id: string,
    @UploadedFiles() files: Array<Express.Multer.File>,
  ) {
    // throw new HttpException("Company not found", HttpStatus.NOT_ACCEPTABLE);
    // console.log(files);
    try {
      this.companiesService.uploadFiles(id, files);
      console.log("didn't get error");
    } catch (error) {
      console.log("got error");
      throw new HttpException("forbidden", HttpStatus.FORBIDDEN);
    }
  }
}

// companies.service.ts

@Injectable()
export class CompaniesService {
  constructor(
    private prisma: PrismaService,
    private s3Service: S3Service,
    private filesService: FilesService,
  ) {}

  async uploadFiles(id: Company["id"], files: Array<Express.Multer.File>) {
    const company = false // for testing

    if (!company) {
      console.log("Company not found");
      throw new Error();
    }
}

我使用 nest start --watch 运行它。

当我调用此端点时,我的应用程序退出并且我将以下内容记录到我的控制台:

didn't get error
Company not found

/src/companies/companies.service.ts:54
      throw new Error();
            ^
Error: 
    at CompaniesService.uploadFiles (/src/companies/companies.service.ts:54:13)

为什么我无法捕获我在控制器中抛出的错误?它显然不是catching,因为它正在记录company not found。异常过滤应该是默认内置的,所以我不确定为什么这不产生500

【问题讨论】:

    标签: nestjs


    【解决方案1】:

    您不是 awaitthis.companiesService.uploadFiles(id, files); 调用,这意味着这是一个未处理的承诺。如果其中有任何错误,则为未处理的拒绝。只需将 async 添加到控制器中的 uploadFiles 并将 await 添加到 this.companiesService.uploadFiles 调用,你就可以开始了

    【讨论】:

    • 是的,就是这样!我知道这一定是我错过的愚蠢的事情。谢谢!
    猜你喜欢
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 2022-06-15
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    相关资源
    最近更新 更多