一般来说,我理解异步/等待,但在这种情况下,它让我困惑什么是最佳实践。我不确定您是否应该像它调用的服务一样使控制器方法异步/等待。
这是我当前在数据库中创建国家/地区的代码:
在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 吗?也许这对于处理控制器中的错误有用?
将控制器方法标记为异步并等待服务方法的结果被认为是最佳实践。您不需要显式等待承诺,因为从异步函数返回它会自动解析承诺。你是对的,你可以捕获 Prisma 独特的错误约束,但是请记住,在控制器中处理 Prisma 特定的错误可能会导致控制器和 Prisma 库之间的耦合。如果您想让控制器保持通用和独立,通常最好在服务层处理这些错误