Запускать вложенные преобразователи с помощью GraphQL

Попробуйте добавить файл «.htaccess» в общую папку с указанным ниже кодом.

RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]

RewriteRule ^ /index.html [L]  
0
задан Guido 16 January 2019 в 13:12
поделиться

1 ответ

Давайте на минутку предположим, что additionalInformation был Скаляр, а не Тип объекта:

type Place {
  name: String!
  additionalInformation: String
}

Значение, возвращаемое решателем places:

[{name: 'Barcelona'}]
[1131 ] Если бы вы сделали аналогичный запрос ...

query {
  places {
    name
    additionalInformation
  }
}

Что бы вы ожидали additionalInformation будет? Это значение будет нулевым, потому что нет свойства additionalInformation в объекте Place, возвращенном распознавателем places.

Даже если мы сделаем additionalInformation Тип объекта (например, AdditionalInformation), результат будет тем же - поле additionalInformation будет иметь нулевое значение. Это потому, что распознаватель по умолчанию (тот, который используется, когда вы не указываете функцию распознавателя для поля) просто ищет свойство с тем же именем, что и поле в родительском объекте. Если ему не удается найти это свойство, возвращается ноль.

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

Чтобы понять, почему это желаемое поведение, представьте другую схему:

type Article {
  title: String!
  content: String!
  image: Image
}

type Image {
  url: String!
  copyright: String!
}

type Query {
  articles: [Article!]!
}

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

const resolvers = {
  Query: {
    articles: () => db.getArticlesWithImages()
  }
  Image: {
    copyright: (image) => `©${image.year} ${image.author}`
  }
}

Допустим, наш вызов getArticlesWithImages преобразуется в одну статью без изображения:

[{title: 'Foo', content: 'All about foos '}]

Как пользователь API я прошу:

query {
  articles {
    title
    content
    image
  }
}

Поле image является необязательным. Если я возвращаю объект article с нулевым полем image, я понимаю, что в БД не было ассоциированного изображения. Как клиент переднего плана я знаю, что не нужно отображать изображение.

Что бы произошло, если бы GraphQL вернул значение для image независимо? Очевидно, наш распознаватель сломался бы, так как ему не передавалось бы какое-либо родительское значение. Более того, однако, как потребитель API, мне теперь нужно было бы проанализировать содержимое image и каким-то образом определить, было ли изображение на самом деле связано со статьей, и я должен что-то с этим сделать.

TLDR;

Как вы уже предлагали, решение здесь состоит в том, чтобы указать преобразователь для additionalInfo. Вы также можете просто вернуть это значение в свой преобразователь places, то есть:

return [{name: 'Barcelona', additionalInfo: {}}]

В действительности, если форма вашей схемы совпадает с формой вашего базового слоя данных, вряд ли вы столкнетесь такого рода проблемы при работе с реальными данными.

0
ответ дан Daniel Rearden 16 January 2019 в 13:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: