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 定义对象类型

使用多个装饰器将 Type-GraphQL 与 Typegoose 相结合

Type-GraphQL 上 JSON 字段的类型

使用 typeorm 和 type-graphql 从 DB 检索数据时出错

不能对 Type-GraphQL 字段类型使用类型“对象”