添加事务后 NestJS 测试失败 - 违反外键约束

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

我正在使用 TypeORM 开发 NestJS 项目,并且在添加事务后遇到测试失败的问题。我收到的错误是尝试将新行插入到 project_group 表中时发生外键约束冲突。这是错误消息:

QueryFailedError:表“project_group”上的插入或更新违反了外键约束“FK_a6e3f0560fc498dc3de01ee4250”

我在我的服务方法中使用 typeorm-transactional-cls-hooked 包中的 runInTransaction 函数,如下所示:

await runInTransaction(async () => {
  await RequestContext.impersonate(invite.user, async () => {
    await this.projectService.addProjectMember(
      project,
      invite.invitedEmail,
      invite.role
    );
  });
  await this.deleteInvite(invite);
});

这是来自project.service.ts的addProjectMember方法:

async addProjectMember(
  project: ProjectEntity,
  email: string,
  role = ProjectRole.Member
) {
  // rest of the code
  const member = await this.projectMemberRepository.save(projectMember);
  // rest of the code
}

我已检查我传递给 addProjectMember 的 ProjectMemberEntity 是否具有具有有效电子邮件地址的有效用户。我还检查了处理 emailDomain 并将其与 projectId 关联的逻辑。那里似乎没有问题导致使用无效的projectId。

我已经在 TypeORM 中启用了所有查询和错误的日志记录,我发现某些删除操作失败,但我没有看到任何回滚错误。这是日志:

query: DELETE FROM "user"
query failed: DELETE FROM "user"
error: error: update or delete on table "user" violates foreign key constraint "FK_e7520163dafa7c1104fd672caad" on table "project_member"

我不确定为什么事务会导致测试失败。任何帮助将不胜感激。

postgresql transactions nestjs typeorm
1个回答
0
投票

看来您的

user
表与 project_member 表具有
外键
关系。因此,从
user
表中删除该行违反了约束并引发上述错误。

您可以使用

ON DELETE CASCADE
配置外键约束(请参阅此处)。执行此操作时,如果您运行 DELETE 查询,这将从
user
表中删除该行以及在
project_member

中引用该行的行
© www.soinside.com 2019 - 2024. All rights reserved.