Конечно, это пример двух мутаций на сервере GraphQL. Мы можем сломать его, чтобы понять, что происходит.
Сначала давайте посмотрим на систему типов. Схема GraphQL обычно имеет два корневых поля query
и mutation
(а иногда и subscription
). Эти корневые поля являются корнем вашей иерархии данных и выставляют запросы (запросы GET) и мутации (запросы POST, PUT, DELETE и т. Д.), К которым у вас есть доступ.
Взглядами него вы реализуете схему с типом мутации корня, который выглядит следующим образом:
type Mutation {
createAuthor: Author
createPost: Post
}
Тип в GraphQL состоит из набора полей, каждая из которых может иметь связанный с ним распознаватель. Резольверы в GraphQL подобны обработчикам событий, которые вы присоединяете к конечным точкам в REST.
код, который вы выше определения двух резольверами, которые будут обрабатывать логику, связанную с createAuthor
и createPost
мутаций. И.Е. код в createPost
распознавателя является то, что будет работать, когда я выполняю запрос, как это:
mutation CreatePost($post: CreatePostInput!) {
createPost(input: $post) {
id
title
tags
text
}
}
Среда GraphQL анализирует запрос и направляет операции на правильный распознаватель в зависимости от содержания запроса. В этом примере, было бы видеть, что я называю createPost
мутацию и удостоверился бы назвать createPost
распознаватель в вашем случае выглядит следующим образом:
createPost: (root, { authorId, tags, title, text }) => {
return Author.findOne({ where: { id: authorId } }).then((author) => {
console.log('found', author);
return author.createPost({ tags: tags.join(','), title, text });
});
},
Чтобы понять, как работает распознаватель, давайте посмотрим на GraphQLFieldResovler определение типа от graphql-JS
export type GraphQLFieldResolver<TSource, TContext> = (
source: TSource,
args: { [argName: string]: any },
context: TContext,
info: GraphQLResolveInfo
) => mixed;
Как вы можете видеть GraphQLFieldResolver это функция, которая принимает 4 аргумента.
- источник: источник родительский объект текущего поля. Например, если вы определяли преобразователь для поля
fullName
типа User
, источником был бы полный пользовательский объект.
- args: Аргументы - любые входные аргументы для этого резольвера. В моем запросе выше он будет содержать значение переменной
$post
.
- context: Контекст - это глобальный контекст для выполнения GraphQL. Это полезно для передачи информации, которая может потребоваться для решения. Например, вы включаете соединение с базой данных, которое вы можете использовать из своих преобразователей, не импортируя его в каждый файл.
- info: Информационный объект содержит информацию о вашей схеме GraphQL, запросе и другой информации, такой как путь к текущему исполнителю. Это полезно во многих отношениях.Вот один пост говорить о том, как вы можете использовать его для предвычисления запросов: (https://scaphold.io/community/blog/querying-relational-data-with-graphql/)
Эта идея иметь типы и полевые арбитры является частью того, что делает GraphQL настолько мощным. После того, как вы определили систему типов и разрешители для своих полей, вы можете структурировать свою схему, но вы хотите, и GraphQL всегда обязательно вызовет правильный распознаватель независимо от того, насколько глубоко вложен запрос.
Я надеюсь, что это помогает :)
спасибо за это, даже им до сих пор путает это мне помогло: D –
@mparis Великого объяснения, но когда вы объясните мне и ответить на вопросы о минных –