0

我正在尝试 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;
  }

谢谢

4

1 回答 1

2

即使 mikro-orm 缓存禁用缓存:{启用:假}

那是元数据缓存,除非您使用 ts-morph,否则默认情况下它是禁用的。

em.nativeDelete()不会从身份映射中删除任何内容,因此如果您在给定上下文中加载了该实体,则通过其 PK 查询将始终从身份映射返回实体而不查询 db。

一般来说,这应该没问题,因为删除请求有自己的上下文 - 您是否正确处理请求上下文?通过em.fork()或通过RequestContext助手。这是必需的。

https://mikro-orm.io/docs/identity-map

如果这是故意在单个上下文中发生的,您可以使用em.removeAndFlush(em.getReference())which 将从身份映射中删除该项目。

于 2020-10-27T16:07:26.170 回答