首页 > 解决方案 > Apollo GraphQL 嵌套突变

问题描述

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

抽象的场景是这样的:

我想在 apollo-server 上结合 2 个突变调用,首先创建 aa ,Customer然后Address为该客户创建一个。Address突变需要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从顶级突变传递到子突变。

标签: javascriptgraphqlapollo

解决方案


您不需要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 };
      }
    },
  }

推荐阅读