Массив объектов Apollo Server и сообщение от React

Итак, я пытаюсь понять, как передать массив объектов из запроса POST на сервер apollo на AWS lambda.

Я проверил это, но это не та проблема Массив объектов конвертируется в объект объектов, когда я использую Apollo

Почтовый запрос выглядит так ...

    api.post('query', { query : `mutation {saveNewItem(description: "${description}", specials: ${JSON.stringify(specials)}){name}}`})
// comment to get rid of silly scroll bar overlapping code

Схема выглядит так ...

    const { gql } = require('apollo-server-lambda')

    const typeDefs = gql`
      type ShoppingItem {
        description: String
        specials: [Specials]
      }

      input Specials {
        description: String
        price: String
        qty: String
        saved: String
      }

  type Mutation {
    saveNewItem(description: String!, specials: [Specials]) : ShoppingItem
  }
`

пример Specials выглядит так ...

[{ // Object One
description: "First One"
price: "1.00"
qty: "1" 
saved: "false"
},{ // Object two
description: "Second One"
price: "1.00"
qty: "1" 
saved: "false"
}]

Ошибка, которую я получаю в настоящее время, ...

'Error: The type of ShoppingItem.specials must be Output Type but got: [Specials].',
  'at assertValidSchema (/Users/me/Desktop/Projects/app/build/node_modules/graphql/type/validate.js:71:11)',

Если я изменю его на нормальный «тип», он будет жаловаться на то, что это не тип ввода.

Я также просмотрел документы сервера apollo и не совсем понимаю, что я делаю не так?

Пожалуйста, чтобы, как упоминал Даниэль в комментариях, хотя технически "повторяющийся" ответ верен, предлагаемая здесь информация гораздо более качественная и полезна для людей, столкнувшихся с проблемой (на мой взгляд)

Возможно, это не точная копия, но есть несколько вопросов типа «ввод, где вывод» и «вывод, где ввод». Вот всего два (здесь и здесь). Как указано в этих потоках, вам необходимо определить как input, так и type - первый для аргументов, а второй для фактических ответов на запросы.

Daniel Rearden 10.01.2019 01:05

Спасибо, Дэниел, дай мне почитать, возможно, я немного устал.

Mrk Fldig 10.01.2019 01:06

Мой комментарий здесь: Apollo-server немного отличается от этих ответов, хотя я пытаюсь понять, как применить логику, поскольку вы сказали, что это может сработать, я просто обдумываю это.

Mrk Fldig 10.01.2019 01:08

Могу я предложить не закрывать это, потому что ваше объяснение намного лучше, чем приведенное ниже.

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

Ответы 1

Ответ принят как подходящий

Вы можете использовать только типы ввода для ввода (GraphQLInputObjectType) и типы объектов для вывода (GraphQLObjectType). Вы используете Specials как оба: как тип вывода для поля specials в ShoppingItem и как тип ввода в аргументе мутации specials. Для этого вам понадобится два типа. Причина этого в том, что типы вывода (могут) иметь резолверы (в вашем случае это фактически абстрагируется от сервера apollo). Вам нужно будет создать два разных типа:

type ShoppingItem {
    description: String
    specials: [Specials]
}

type Specials {
    description: String
    price: String
    qty: String
    saved: String
}

input SpecialsDraft {
    description: String
    price: String
    qty: String
    saved: String
}

type Mutation {
    saveNewItem(description: String!, specials: [SpecialsDraft]) : ShoppingItem
}

Я такой идиот, я буквально подумал, что после комментариев Дэниела выше, поставьте мне две отметки и позвольте мне проверить это. Спасибо.

Mrk Fldig 10.01.2019 01:11

Извините, я думаю, что ответ Дэниела отличный и указывает правильное направление. Увидел после публикации :(

Herku 10.01.2019 01:14

Итак, я получаю ожидаемый объект SpecialsDraft, одна секунда просто проверяет мой код.

Mrk Fldig 10.01.2019 01:14

Итак, запрос проходит как (это регистрирует тело события в api: "{\" query \ ": \" mutation {saveNewItem (description: \\\ "Something \\\", specials: [{\\ \ "описание \\\": \\\ "Goo \\\", \\\ "кол-во \\\": \\\ "1 \\\", \\\ "‌ цена \\\": \\\ "1 \\\", ‌ \\\ "сохранено \\\": false} ‌]) {name}} \ "}"

Mrk Fldig 10.01.2019 01:24

И это дает ожидаемое описание строки Name found. На данный момент я отмечу это как правильное, поскольку вы ответили на вопрос, который я задал, поэтому спасибо!

Mrk Fldig 10.01.2019 01:26

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