Вложенные данные GraphQL в мутации

У меня возникают проблемы с работой мутации в GraphQL, когда тип в схеме включает вложенный тип. Скажем, у меня есть тип данных для бронирования:

const BookingType = new GraphQLObjectType({
    name: 'Booking',
    fields: () => ({
        id: { type: GraphQLInt },
        Date: { type: GraphQLString },
        Venue: { type: GraphQLString }
    })
});

В файле схемы у меня также есть корневая мутация, которая выглядит так:

createBooking: {
  type: BookingType,
  args: {
    Date: { type: new GraphQLNonNull(GraphQLString) },
    Venue: { type: new GraphQLNonNull(GraphQLString) }
  },
  resolve(parentValue, args){
    return axios.post('http://localhost:3000/booking', args)
      .then(resp => resp.data);             
  }
}

Я могу написать мутацию в GraphiQL, чтобы без проблем создавать данные для бронирования:

mutation {
  createBooking(
    Date: "2018-03-12",
    Venue: "Some place",
  ) {
    id
    Date
    Venue
  }
}

Все идет нормально. Теперь мне нужно добавить вложенный тип к исходному объекту бронирования для записи сотрудников, назначенных для бронирования. Поэтому я добавил типы для сотрудника (как входные, так и выходные типы) и добавил их к типу бронирования и мутации:

// output type
const AssignedStaffType = new GraphQLObjectType({
    name: 'AssignedStaff',
    fields: () => ({
        id: { type: GraphQLInt },
        Name: { type: GraphQLString }
    })
});

// input type
const AssignedStaffInputType = new GraphQLInputObjectType({
    name: 'AssignedStaffInput',
    fields: () => ({
        id: { type: GraphQLInt },
        Name: { type: GraphQLString }
    })
});

Тип бронирования становится:

const BookingType = new GraphQLObjectType({
    name: 'Booking',
    fields: () => ({
        id: { type: GraphQLInt },
        Date: { type: GraphQLString },
        Venue: { type: GraphQLString },
        Staff: { type: new GraphQLList(AssignedStaffType) }
    })
});

И корневая мутация становится:

createBooking: {
  type: BookingType,
  args: {
    Date: { type: new GraphQLNonNull(GraphQLString) },
    Venue: { type: new GraphQLNonNull(GraphQLString) },
    Staff: { type: new GraphQLList(AssignedStaffInputType) }
  },
  resolve(parentValue, args){
    return axios.post('http://localhost:3000/booking', args)
      .then(resp => resp.data);             
  }
}

Я не знаю, как теперь сформулировать мутацию в GraphiQL, в частности, что использовать в качестве значения для Staff:

mutation {
  createBooking(
    Date: "2018-03-14",
    Venue: "Some place",
    Staff: // ??? <--- What goes here??
  ) {
    id
    Venue
    Date
    Staff
  }
}

Я попытался предоставить ему объект или массив объектов, которые имеют ту же структуру, что и AssignedStaffInputType, но я просто получаю сообщение об ошибке («ожидание AssignedStaffInputType»). Клиент (в данном случае GraphiQL) ничего не знает о AssignedStaffInputType, как определено в схеме, поэтому я не понимаю а) как использовать этот тип ввода в клиенте, или б) как я затем заполняю такой введите требуемые данные.

Помоги пожалуйста!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
0
0
1 820
1

Ответы 1

Ничего, я понял. Фактически я могу передать объект (или массив объектов) в правильном формате (указанном в типе ввода в схеме), и он отлично работает. Причина, по которой у меня были проблемы, заключалась в том, что у меня был неправильный скалярный тип для одного из полей в типе ввода, и это вызывало ошибку. Клиенту не нужно знать о типах, указанных в схеме. Итак, вышеупомянутая проблемная мутация, по сути, должна быть записана так:

mutation {
  createBooking(
    Date: "2018-03-14",
    Venue: "Some place",
    Staff: [{staffId: 1}]
  ) {
    id
    Venue
    Date
    Staff{
       Name
    }
  }
}

Другие вопросы по теме