Apollo GraphQL 嵌套突变
Apollo GraphQL Nested Mutation
需要一些关于嵌套突变的帮助。
抽象的场景是这样的:
我想结合 apollo-server 上的 2 个突变调用,首先创建一个 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
从顶级突变传递给子突变。
解析器中不需要 Response
字段。 createCustomerWithAddress
应该 return 形状像 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 };
}
},
}
需要一些关于嵌套突变的帮助。
抽象的场景是这样的:
我想结合 apollo-server 上的 2 个突变调用,首先创建一个 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
从顶级突变传递给子突变。
解析器中不需要 Response
字段。 createCustomerWithAddress
应该 return 形状像 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 };
}
},
}