https://github.com/taion/graphql-type-json/blob/master/src/index.js

тим, мой сервер graphql хочет получить следующие данные в формате JSON, гдеperson3 а такжеperson5 некоторые идентификаторы:

"persons": {
  "person3": {
    "id": "person3",
    "name": "Mike"
  },
  "person5": {
    "id": "person5",
    "name": "Lisa"
  }
}

Вопрос: Как создать определение типа схемы с помощью apollo?

Ключиperson3 а такжеperson5 здесь генерируются динамически в зависимости от моего запроса (т.е.area используется в запросе). Так что в другой раз я мог бы получитьperson1, person2, person3 вернулся. Как вы видитеpersons не является Iterable, поэтому следующее не будет работать как определение типа graphql, которое я сделал с apollo:

type Person {
  id: String
  name: String
}
type Query {
  persons(area: String): [Person]
}

Ключи вpersons Объект всегда может быть другим.

Одним из решений, конечно, было бы преобразование входящих данных JSON для использования массива дляpersons, но нет ли способа работать с данными как таковыми?

 Andru04 окт. 2017 г., 13:05
@DanielRearden Такb а такжеg Идентификаторы. Возможно, мне следует пояснить этот вопрос. Запрос будет содержать параметры для получения только подмножества людей, поэтому для одного запроса ответ будет содержать людей с идентификаторамиa, b, c и для другого запроса, напримерb а такжеg как в вопросе.
 Daniel Rearden04 окт. 2017 г., 12:55
Можете ли вы уточнить, что вы подразумеваете подb а такжеg являющийсяdynamically generated depending on my query? Наличие одного или другого зависит от полей, присутствующих в запросе?
 Andru04 окт. 2017 г., 13:11
@DanielRearden Я сейчас изменилсяb вperson3 а такжеg вperson 5 и добавил текст и переменную, чтобы сделать его более понятным. Запрос будет содержать параметры, позволяющие получить только подмножество людей, как показано в тексте.

Ответы на вопрос(2)

Решение Вопроса

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

Вымог использовать обычайJSON скаляр и верните это для вашего запроса:

type Query {
  persons(area: String): JSON
}

Используя JSON, вы обойдете требование, чтобы возвращаемые данные соответствовали какой-либо конкретной структуре, поэтому вы можете отправлять обратно все, что захотите, при условии правильного форматирования JSON.

Конечно, в этом есть существенные недостатки. Например, вы теряете сеть безопасности, обеспечиваемую типом (ами), которые вы ранее использовали (буквально любая структура может быть возвращена, и если вы возвращаете неправильную, вы не узнаете об этом, пока клиент не попробует) использовать его и не удается). Вы также теряете возможность использовать распознаватели для любых полей в возвращаемых данных.

Но ... твои похороны :)

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

 Andru04 окт. 2017 г., 17:54
Спасибо за ваши комментарии! Я преобразовываю входящие данные с сервера. К вашему сведению: причина для объектов с идентификаторами была в более быстром поиске на стороне клиента, потому что это просто поиск идентификатора для доступа к конкретному человеку.
 Tim Fletcher21 февр. 2018 г., 13:06
Моя ситуация возвращает ошибки валидации через Rails / GraphQL API. Я не знаю заранее, какие ключи будут иметь ошибки, поэтому я использую собственный скаляр JSON.
 Tim Fletcher21 февр. 2018 г., 13:32
На самом деле я изменил свой подход к использованию вложенных массивов, что позволило мне последовательно возвращать поля с ошибками.

GraphQLScalarType и точно опишите ваш объект и ваши динамические ключи, что вы разрешаете, а что не разрешаете или не трансформируете.

Видетьhttps://graphql.org/graphql-js/type/#graphqlscalartype

Вы можете взглянуть наtaion / graphql-типа JSON где он создает скаляр, который позволяет и преобразует любой вид контента:

https://github.com/taion/graphql-type-json/blob/master/src/index.js

Ваш ответ на вопрос