Apollo GraphQL 嵌套突变

Posted

技术标签:

【中文标题】Apollo GraphQL 嵌套突变【英文标题】:Apollo GraphQL Nested Mutation 【发布时间】:2020-04-24 12:47:47 【问题描述】:

在嵌套突变方面需要一些帮助。

抽象的场景是这样的:

我想在 apollo-server 上组合 2 个突变调用,首先创建一个 Customer,然后为该客户创建一个 AddressAddress 突变需要 customerID 才能做到这一点,但也需要来自原始整体突变的信息,它需要访问。

这是通用代码:

makeExecutableSchema(
  typeDefs: gql`
    type Mutation 
      createCustomerWithAddress(customer: CustomerRequest!, address: AddressRequest!): Response
    
    input CustomerRequest 
       name: String!
    

    input AddressRequest 
       address: String!
       city: String!
       state: String!
       country: String!
    

    type Response 
       customerID: Int!
       addressID: Int!
    
  `,
  resolvers: 
    Mutation: 
      createCustomerWithAddress: async (_, customer, context, info) => 
        return await api.someAsyncCall(customer);
      
    ,
    Response: 
      addressID: async(customerID) => 
        // how do we get AddressRequest here?
        return await api.someAsyncCall(customerID, address);
      
    
  
)



我没有从原始代码中展示很多复杂性,但我想了解的只是如何通过子突变访问请求参数的根源,如果可能的话。我真的不想将address 从***突变传递到子突变。

【问题讨论】:

跟进问题?有没有更好的方法来链接这些突变?从前端 UI,我希望能够对 graphql apollo 服务器进行一次调用,该服务器将进行 2 个 API 调用,一个用于创建联系人,另一个用于创建地址。该地址将需要创建的联系人 ID。 【参考方案1】:

解析器中不需要Response 字段。 createCustomerWithAddress 应该返回一个形状类似于 Response 的对象。

resolvers: 
    Mutation: 
      createCustomerWithAddress: async (_, customer, address, context, info) => 
        // create customer
        const customerId = await api.CreateCustomer(customer);
        // create address and assign customerId
        const addressId = await api.CreateAddress( ...address, customerId );
        // return response
        return  customerId, addressId ;
      
    ,
  

【讨论】:

我已经更新了这个例子......也许我在这里错误地链接了突变,但我需要等待一个更新/突变发生以获得 ID customerID,然后将其添加到地址 @ChrisFricke 您在同一个解析器中创建了客户和地址。我更新了示例。 @ChrisFricke 我能回答你的问题吗? 嘿@silent,是的,我可以这样做,只是似乎没有正确使用graphql,但也许就是这样。除了能够选择字段之外,这与将其编写为仅作为快速编排调用有什么不同?这是一个简化的示例,老实说,我将它与两种不同的模式和突变分开,一个用于地址,一个用于客户,并且一直试图在这个组突变上将调用委托给每个人。那有意义吗?在突变解析器中,我只是将ToSchema 委托给其中的每一个,但仍然感觉不对。 @ChrisFricke 据我所知,这是正确的方法。我想你基本上是在问 Graphql 比 REST 有什么优势 - howtographql.com/basics/1-graphql-is-the-better-rest

以上是关于Apollo GraphQL 嵌套突变的主要内容,如果未能解决你的问题,请参考以下文章

Apollo/graphQL:如何将乐观 UI 用于嵌套反应组件的突变?

无法使用 graphq-request 表示嵌套对象输入类型的数组

GraphQL 嵌套突变 + Sequelize

Apollo / GraphQL / Prisma“登录”突变不会返回所有用户字段

如何在 Apollo / GraphQL 发生突变后更新缓存?

React Native、GraphQL、Apollo - 如何创建批量插入突变