使用 prisma 时,NestJS 中的控制器方法需要异步/等待吗?

问题描述 投票:0回答:1

一般来说,我理解异步/等待,但在这种情况下,它让我困惑什么是最佳实践。我不确定您是否应该像它调用的服务一样使控制器方法异步/等待。

这是我当前在数据库中创建国家/地区的代码:

在country.controller.ts

@Post()
  async createCountry(@Body() createCountryDto: CreateCountryDto,): Promise<Country> {
    return await this.countryService.createCountry(createCountryDto);
  }

在country.service.ts

async createCountry(createCountrynDto: CreateCountryDto): Promise<Country> {
    try {
      const country: Country = await this.prisma.country.create({
        data: {
          name: createCountrynDto.name,
        },
      });

      return country;
    } catch (error) {
      if (error instanceof PrismaClientKnownRequestError) {
        if (error.code === 'P2002') {
          throw new ConflictException('County name must be unique');
        }
      }
      throw error;
    }
  }

如果我在country.service.ts 文件中的createCountry 中调用async/await,我是否还必须使我的控制器功能异步并等待结果?我没有收到关于在控制器中需要 async wait 的抱怨,但是有它还是没有它更好,为什么?

Prisma 示例代码的 NestJs 文档不会等待控制器中的结果,但它们仍然使函数异步。大多数教程都会忽略这一部分,甚至不会使控制器功能异步。

我在教程中看到很多人使用的另一个选项是像这样实现 createCountry 服务:

async createCountry(createCountrynDto: CreateCountryDto) {
      return this.prisma.country.create({
        data: {
          name: createCountrynDto.name,
        },
      });
}

这难道不会让你无法捕获 Prisma 独特的错误约束,因为不等待 Promise 吗?也许这对于处理控制器中的错误有用?

async-await nestjs prisma
1个回答
0
投票

将控制器方法标记为异步并等待服务方法的结果被认为是最佳实践。您不需要显式等待承诺,因为从异步函数返回它会自动解析承诺。你是对的,你可以捕获 Prisma 独特的错误约束,但是请记住,在控制器中处理 Prisma 特定的错误可能会导致控制器和 Prisma 库之间的耦合。如果您想让控制器保持通用和独立,通常最好在服务层处理这些错误

© www.soinside.com 2019 - 2024. All rights reserved.