Как GraphQl присваивает значение GraphQLObjectType - PullRequest
0 голосов
/ 04 декабря 2018

Прежде чем я начну, код может выглядеть длинным, но он вращается вокруг простых основ GraphQl

Я изучал GraphQl и сделал простые основы, сначала создав

Dummy Data для книги Авторы

let books = [
        { 
            name: "Got 1",
            genre: "Science Fictional",
            id: "1",
            authorId: "1"
        },
        {
            name: "Got 2",
            genre: "fictional",
            id: "2",
            authorId: "2"
        }
]

И

let authors = [
    { 
        name: "Martin",
        age: 63,
        id: "1"
    },
    {
        name: "Martin 1",
        age:  48,
        id: "2"
    }

]

Теперь я создал objectType для Книг, подобных этой

const BookType = new GraphQLObjectType({  
    name: 'Book', 
    fields: () => ({
        id: { type: GraphQLID},
        name: { type: GraphQLString},
        genre: { type: GraphQLString },
        author: {
          type: authorType, 
          resolve (parents, args)  {
              for ( let i=0; i < authors.length; i++) {
                   if ( parents.authorId == authors[i].id) {
                       return authors[i]
                   }
            }
         }
    })
})

, и Аналогично для Автор, подобных этой

const authorType = new GraphQLObjectType({  
    name: 'author', 
    fields: () => ({
        id: { type:  GraphQLID},
        name: { type: GraphQLString},
        age: { type: GraphQLInt }
    })
})

Раньше у меня сложилось впечатление, что наши ключи в наших фиктивных данных должны быть эквивалентны ключам в нашем Типе объекта (например, name в наших фиктивных данных книг должно быть таким же, как у name в наших полях из BookType и аналогично для автора) и, следовательно, когда мы запускаем запрос из внешнего интерфейса, оно выглядит следующим образом

books(id: 2)
     name, 
     genre, 
     id 
     author: {
        name 
      }
   }

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

[Вопрос:] Итак мой вопрос Как GraphQl назначает данные для соответствующего запроса?Я намеренно не написал свой корневой запрос, но если он потребуется, дайте мне знать, с удовольствием поделюсь им.

1 Ответ

0 голосов
/ 04 декабря 2018

Схема, используемая вашей конечной точкой GraphQL, не обязательно должна соответствовать форме данных, предоставляемых какими-либо слоями данных, используемыми вашим сервером.Поля, которые вы определяете для определенного GraphQLObjectType, просто определяют, какие поля могут запрашиваться для этого типа клиентами.

Это означает, что каждая книга в массиве books может иметь некоторое дополнительное свойство (например, upcили numberOfCheckouts) но это свойство не обязательно должно отображаться в вашей схеме.Если у вас была таблица пользователей в базе данных, включающая поле password и тип User, вы, возможно, не захотите выставлять password как поле этого типа, даже если вы включите другие поля.

Аналогично, тип может иметь поле, имя которого не соответствует базовым данным.Здесь каждая книга не имеет свойства author, а тип Book.Предоставляя функцию resolve для поля, вы сообщаете GraphQL, как разрешить это поле (или присвоить ему значение).

Точная логика, лежащая в основе того, как GraphQL разрешает полезначения, вероятно, выходят за рамки этого вопроса, но вы можете взглянуть на спецификацию для более подробной информации.Здесь уместно, что каждое поле должно иметь какое-то значение.Если вы не предоставляете функцию resolve, GraphQL использует распознаватель по умолчанию , который ищет свойство в объекте parent , передаваемом сопоставителю, имя которого совпадает с именем полярешается.Если распознаватель по умолчанию находит свойство с тем же именем, он возвращает значение этого свойства;в противном случае возвращается ноль.

Именно поэтому вы можете добавлять поля к Book, например id, name или genre, без указания функции resolve - распознаватель по умолчанию выполняет всю работу подhood.

Что касается конкретно Типов объектов, важно понимать, что значение, возвращаемое преобразователем поля, который возвращает тип объекта , становится родительским значением, передаваемым преобразователям поля поля для этого типа..

Таким образом, если поле имеет тип [Book], оно будет (если реализовано правильно) возвращать массив объектов.Этот массив может быть, например, фиктивными данными в вашем вопросе.Каждый объект в этом массиве будет затем передан в функцию resolve для каждого поля типа Book, которое было включено в запрос клиента.Поэтому, если клиент запрашивает только id и name для каждой книги, функция resolve для каждого из этих двух полей будет выполняться для каждой книги в массиве, возвращаемом распознавателем родительского поля.

Функция resolve, или преобразователь, передается в родительском значении, аргументах для разрешаемого поля и контексте всего запроса.Вся информация может быть использована для разрешения любого поля, которое вы можете произвольно определить для определенного типа.

Надеюсь, это обеспечит вам дополнительную ясность.При построении схемы ваше решение о том, какие поля определять для типа, вероятно, будет зависеть от уровня данных, но не ограничивается этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...