Вложенные данные 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, как определено в схеме, поэтому я не понимаю а) как использовать этот тип ввода в клиенте, или б) как я затем заполняю такой введите требуемые данные.

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


person Drum    schedule 14.03.2018    source источник


Ответы (1)


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

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