我正在使用 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"
我不确定为什么事务会导致测试失败。任何帮助将不胜感激。
看来您的
user
表与 project_member
表具有 外键关系。因此,从
user
表中删除该行违反了约束并引发上述错误。
您可以使用
ON DELETE CASCADE
配置外键约束(请参阅此处)。执行此操作时,如果您运行 DELETE 查询,这将从 user
表中删除该行以及在 project_member
中引用该行的行