问题描述
我正在尝试mikro-orm,所以我做了一个简单的CRUD解析器,但是我从graphql调试控制台中看到,删除后就像:
mutation{
deleteItem(id:9)
}
具有以下代码
@Mutation(() => Boolean)
async deleteItem(@Arg('id') id: number,@Ctx() { em }: MyContext): Promise<boolean> {
try {
await em.nativeDelete(Item,{ id });
return true;
} catch (error) {
console.log(error);
return false;
}
}
预期的响应是可以的。
但是,如果我尝试编辑已删除的项目,则即使禁用了mikro-orm缓存,cache: { enabled: false },
也会返回已编辑的项目。
错误在哪里?我需要强制冲洗吗?
这是editItem解析器:
@Mutation(() => Item,{ nullable: true })
async editItem(
@Arg('id') id: number,@Arg('data',() => String,{ nullable: true }) data: string,@Ctx() { em }: MyContext
): Promise<Item | null> {
const item = await em.findOne(Item,{ id });
if (!item) {
return null;
}
console.log(item);
if (typeof data !== 'undefined') {
post.data = data;
await em.persistAndFlush(item);
}
return item;
}
谢谢
解决方法
即使已禁用mikro-orm高速缓存,高速缓存:{启用:false}
这是元数据缓存,除非您使用ts-morph,否则默认情况下将其禁用。
em.nativeDelete()
不会从身份映射中删除任何内容,因此,如果您在给定的上下文中加载了该实体,则通过其PK查询将始终从身份映射中返回该实体而无需查询数据库。
通常,这应该没问题,因为删除请求具有其自己的上下文-您是否正确处理了请求上下文?通过em.fork()
或通过RequestContext
助手。这是必需的。
https://mikro-orm.io/docs/identity-map
如果这是故意在单个上下文中发生的,则可以使用em.removeAndFlush(em.getReference())
将其从身份映射中删除。