具有父子关系的 2 个实体的 GraphQL 突变返回第二个实体的旧值

Posted

技术标签:

【中文标题】具有父子关系的 2 个实体的 GraphQL 突变返回第二个实体的旧值【英文标题】:GraphQL mutation for 2 entities with parent-child relation returns old value for second entity 【发布时间】:2021-04-30 05:32:53 【问题描述】:

我正在使用阿波罗服务器。

在修改数据时,我需要更新 2 个表:locationaddress

解析器函数结束:

const locationUpdated = await db.location.updateLocation(user.id, location);
const addressUpdated = await db.address.updateAddress(user.id, location.address);
return  error: null, location:  ...locationUpdated, address: addressUpdated  ;

使用 GraphQL Playground:

mutation 
  updateLocation(
    location: 
      id: 1
      label: "label12"
      address:  
        city: "city12"
      
    
  ) 
    error
    location 
      label
      address 
        city
      
    
  

因此我有新的location.label 但旧的location.address.city


  "data": 
    "updateLocation": 
      "error": null,
      "location": 
        "label": "label12",
        "address": 
          "city": "city11",
        
      
    
  

数据库已正确更新。看起来服务器使用缓存?

【问题讨论】:

【参考方案1】:

你可以尝试以下两种方式

    覆盖服务器缓存设置。 Ref
const server = new ApolloServer(
  // ...
  cacheControl: 
    defaultMaxAge: 0,
  ,
));
type Post @cacheControl(maxAge: 240) 
  id: Int!
  title: String
  author: Author
  votes: Int @cacheControl(maxAge: 30)
  comments: [Comment]
  readByCurrentUser: Boolean! @cacheControl(scope: PRIVATE)


type Comment @cacheControl(maxAge: 1000) 
  post: Post!

    更新id。 Ref
updateLocation(
    location: 
      id  //from the doc, I saw that the id must be updated as well, you can try take out the hard code `1`
      label: "label12"
      address:  
        city: "city12"
      
    
  )

【讨论】:

我不想关闭缓存或更改实体的生命周期。我想以某种方式刷新缓存。 @koral 检查我更新的答案。我检查了文档,它可能与id 更新问题有关。在进行突变时也尝试更新id

以上是关于具有父子关系的 2 个实体的 GraphQL 突变返回第二个实体的旧值的主要内容,如果未能解决你的问题,请参考以下文章

Prisma、GraphQL 和 Apollo 中具有突变的数据关系和连接类型

仅在父子实体具有 1 到 M 关系的核心数据中获取父实体的数据

Apollo / GraphQl - 单实体突变不更新缓存(数据库更新)

使用 NestJS、TypeORM、GraphQL 更新具有实体之间关系的 PSQL 表

如何使用 Django 嵌套对象添加 GraphQL 突变?

在一个http请求中多次调用相同的GraphQL突变操作[重复]