Nestjs QueryRunnerAlreadyReleasedError在单个事务中执行一系列查询时

Nestjs QueryRunnerAlreadyReleasedError在单个事务中执行一系列查询时,nestjs,typeorm,Nestjs,Typeorm,我添加了一个OnMoudleInit服务来初始化我的NestJS应用程序中的一些示例数据 TypeORM提供了几种将查询包装成单个事务的方法 我尝试使用EntityManager.transaction包装操作 等待此.manager.transaction(异步(管理器)=>{ //注意:必须使用给定的manager实例执行所有数据库操作 //这是EntityManager处理此事务的一个特殊实例 //别忘了在这里等待 const del=wait manager.delete(PostEnt

我添加了一个
OnMoudleInit
服务来初始化我的NestJS应用程序中的一些示例数据

TypeORM提供了几种将查询包装成单个事务的方法

我尝试使用
EntityManager.transaction
包装操作

等待此.manager.transaction(异步(管理器)=>{
//注意:必须使用给定的manager实例执行所有数据库操作
//这是EntityManager处理此事务的一个特殊实例
//别忘了在这里等待
const del=wait manager.delete(PostEntity,{});
log('posts deleted:',del.infected);
const userDel=await manager.delete(UserEntity,{});
log('users deleted:',userDel.impacted);
const user=new UserEntity();
对象。分配(用户{
名字:“汉西”,
姓‘白’,
电邮:'hantsy@gmail.com',
});
const savedUser=wait manager.save(用户);
log('saved user:',JSON.stringify(savedUser));
this.data.forEach(异步(d)=>{
const p=新的PostEntity();
p、 作者=savedUser;
//注释掉这些关系设置,它会很好地工作。
// 
//const comment=new CommentEntity();
//comment.content='测试注释位于:'+新日期();
//p.comments=Promise.resolve([注释]);
分配(p,d);
等待经理。保存(p);
});
});
const savedPosts=wait this.postRepository.find({});
log('saved:',JSON.stringify(savedPosts));
}
应用程序启动时,发生以下错误

已删除帖子:2篇
已删除用户:1
保存的用户:{“firstName”:“hantsy”,“lastName”:“bai”,“email”:hantsy@gmail.com,“id”:“04d5cc63-d36a-4d80-a37f-97424ef168a8”}
D:\hantsylabs\nestjs graphql sample\node\u modules\typeorm\error\queryRunneralReadyReleaseError.js:10
var _this=_super.call(this)| this;
^
QueryRunnerAlreadyReleasedError:查询运行程序已发布。无法再运行查询。
在新的QueryRunnerAlreadyReleasedError(D:\hantsylabs\nestjs graphql sample\node\u modules\typeorm\error\QueryRunnerAlreadyReleasedError.js:10:28)
更新:我发现这是由post/comment
级联
设置引起的,我试图使用一个命令来保存post/comments

@OneToMany((type)=>CommentEntity,(comment)=>comment.post{
答:是的,
})
评论?:承诺;
更新2:如果我使用
存储库
类执行
保存
任务,它似乎可以工作

const post=new PostEntity();
post.title=‘测试标题’;
post.content=‘测试内容’;
const comment=new CommentEntity();
comment.content='测试注释';
post.comments=Promise.resolve([comment]);
等待这个.postRepository.save(post);
//log('从存储库保存:',JSON.stringify(savedPost));

当我在manager事务块之前添加上述代码时,我发现
manager.delete(Post,{})
没有应用
cascade
设置?

从Nestjs/TypeORM discord讨论中得到了答案

将以下代码更改为:

this.data.forEach(异步(d)=>{
const p=新的PostEntity();
p、 作者=savedUser;
//注释掉这些关系设置,它会很好地工作。
// 
//const comment=new CommentEntity();
//comment.content='测试注释位于:'+新日期();
//p.comments=Promise.resolve([注释]);
分配(p,d);
等待经理。保存(p);
});
为此,请使用
Promise.all
包装所有异步代码

等待承诺(
this.data.map(异步(d)=>{
const p=新的PostEntity();
分配(p,d);
p、 作者=用户;
const c=CommentEntity.of('test comment at:'+new Date());
p、 评论=承诺。解决([c]);
等待经理保存(p);
}),
);
});