mikro-orm 使用 type-graphql 缓存数据
Posted
技术标签:
【中文标题】mikro-orm 使用 type-graphql 缓存数据【英文标题】:cached data by mikro-orm using type-graphql 【发布时间】:2021-02-09 22:54:59 【问题描述】:我正在尝试 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;
谢谢
【问题讨论】:
【参考方案1】:即使 mikro-orm 缓存禁用缓存: enabled: false
即元数据缓存,除非你使用 ts-morph,否则默认禁用。
em.nativeDelete()
不会从身份映射中删除任何内容,因此如果您在给定上下文中加载了该实体,则通过其 PK 查询将始终从身份映射返回实体而不查询数据库。
通常这应该没问题,因为删除请求有自己的上下文 - 您是否正确处理请求上下文?通过em.fork()
或RequestContext
助手。这是必需的。
https://mikro-orm.io/docs/identity-map
如果故意在单个上下文中发生这种情况,您可以使用 em.removeAndFlush(em.getReference())
从身份映射中删除该项目。
【讨论】:
多么荣幸!,感谢您与 mikro-orm btw 的合作,是的,我认为我误用了上下文,实际上我的上下文是在通过上下文传递给 appllo 的主函数中创建的:() => ( em: orm.em ), 看看这个以获得灵感github.com/driescroons/mikro-orm-graphql-example以上是关于mikro-orm 使用 type-graphql 缓存数据的主要内容,如果未能解决你的问题,请参考以下文章
属性类型日期和字段类型字符串的 Mikro-orm 迁移错误
使用多个装饰器将 Type-GraphQL 与 Typegoose 相结合