Apollo GraphQL - вложенная мутация - PullRequest
0 голосов
/ 07 января 2020

нужна помощь по вложенным мутациям.

Абстрактный сценарий таков:

Я хочу объединить 2 вызова мутации на apollo-сервере, чтобы сначала создать Customer, а затем создать Address для этого клиента. Мутация Address нуждается в customerID, чтобы иметь возможность сделать это, но также имеет информацию из исходной общей мутации, к которой ей нужен доступ.

Вот обобщенный c код:

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);
      }
    }
  }
})



Существует много сложностей, которые я не показываю из исходного кода, но то, что я хотел получить, это просто root о том, как получить доступ к параметрам запроса через мутации, если это возможно. Я действительно не хочу передавать address из верхней мутации в суб мутацию.

1 Ответ

1 голос
/ 07 января 2020

Вам не нужно поле 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 };
      }
    },
  }
...