如何正确处理Nest.js服务层中的错误

问题描述 投票:0回答:1
我们正在使用nest.js和Mikroorm构建API,我们正在就与Nest.js.js.js.s的“层”相关的几件事进行辩论。

LET假设您在服务上具有以下更新方法。

这种方法做了几件事:

第一,向ORM询问该项目是否存在。如果不是这样,它将返回一个notfounderror

  • 第二,它检查客户端是否存在。如果不是这样,服务将返回一个NotFoundError。

  • 最终,进行更新
  • async update( id: number, updateProjectDto: UpdateProjectDto, ): Promise<Projects> { try { const project = await this.projectRepository.findOneOrFail(id); if (updateProjectDto.client_id) { project.client = await this.clientService.findOne( updateProjectDto.client_id, ); } this.projectRepository.assign(project, updateProjectDto); await this.projectRepository.getEntityManager().flush(); return project; } catch (error) { this.logger.error('Error updating project', error); throw error; } }
  • 这里是我们的客户发现

    async findOne(id: number) { try { return await this.clientsRepository.findOneOrFail({ id }); } catch (error) { this.logger.error(`Error finding client`, error); throw error; } }

  • 我们的问题如下:

当我们应该在尝试捕获中包装业务逻辑时?

我们应该使用API上的每种方法尝试捕获,或者让错误起泡,因为我们没有特别对它们做任何事情?

  • 服务应该投掷httpexceptions(考虑到其执行此操作的“适当”层)。我们认为可以简单地将它们扔到这里是可以的。

  • 提前感谢!
  • 如果您想遵循域驱动的设计和清洁体系结构原理,则在您的域层中,您不应抛出异常,因为它们属于接口(或API)层。 您可以使用某些库(例如
  • effect-ts

    oxyde
  • .

在这种方法中,存储库的合同将是这样:

javascript node.js nestjs
1个回答
0
投票

export interface UserRepository { createUser(data: UserProps): Promise<Option<User>>; getUserByEmail(email: string): Promise<Option<User>>; getUserById(id: string): Promise<Option<User>>; checkActiveUserById(id: string): Promise<boolean>; getAllUsers<T extends PaginatedQueryParams>( params?: T, ): Promise<Collection<User>>; }

在API控制器中,您将逻辑返回数据或抛出异常:

  @PublicApi()
  @Post('/login')
  async login(@Body() body: LoginBody): Promise<JwtUser> {
    return this.jwtAuth.generateJwtUser(
      getOrThrowWith(
        await this.loginUseCase.execute(body),
        () => new UnauthorizedException('Login Error!'),
      ),
    );
  }

如果您想深入研究DDD和干净的体系结构,我创建了以下Nestjs存储库:

Https://github.com/andrea-acampora/nestjs-dddddddddddevops

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.