LET假设您在服务上具有以下更新方法。
这种方法做了几件事:第一,向ORM询问该项目是否存在。如果不是这样,它将返回一个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上的每种方法尝试捕获,或者让错误起泡,因为我们没有特别对它们做任何事情?
或
oxyde在这种方法中,存储库的合同将是这样:
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