Попробуйте добавить файл «.htaccess» в общую папку с указанным ниже кодом.
RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]
RewriteRule ^ /index.html [L]
Давайте на минутку предположим, что 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
и каким-то образом определить, было ли изображение на самом деле связано со статьей, и я должен что-то с этим сделать.
Как вы уже предлагали, решение здесь состоит в том, чтобы указать преобразователь для additionalInfo
. Вы также можете просто вернуть это значение в свой преобразователь places
, то есть:
return [{name: 'Barcelona', additionalInfo: {}}]
В действительности, если форма вашей схемы совпадает с формой вашего базового слоя данных, вряд ли вы столкнетесь такого рода проблемы при работе с реальными данными.