GraphQL — это очень мощная концепция, которая может помочь нам в создании API.
В этом посте будет показано простое видео-приложение для изучения операций GraphQL CRUD.
Предпосылки
- База данных MongoDB
- Рабочая среда узла
Полный код здесь
Разработайте схему
В REST мы рассматриваем API как набор конечных точек; однако в GraphQL мы видим их как набор типов.
Итак, где мы определяем типы?
В GraphQL файл схемы определяет типы, доступные в API. Это контракт, используемый как клиентом, так и сервером для обеспечения совместимости отправляемых и получаемых ими данных.
Теперь давайте определим нашу схему.
Фильм Тип объекта
В нашем примере мы используем тип Movie
для определения схемы объекта фильма, который имеет уникальный идентификатор и некоторые другие поля, такие как название, жанр, дата выпуска и т. д.
type Movie { id: ID! title: String! url: String! year: Int! genre: MovieGenreEnum! # predefined enum type rating: Float! created_at: Datetime! # predefined scalar type }
Этот тип является важным элементом нашей схемы фильма; он в основном используется в других типах.
Тип запроса
Тип query является корневым типом в схеме GraphQL и представляет запросы, которые клиент будет отправлять на сервер.
В нашем примере мы можем выполнить следующий запрос
- получить конкретный фильм
- получить весь фильм, внедрив фильтры, сортировку и пейджинг
- получить общее количество фильмов.
type Query { movie(id:ID!): Movie! movies(filter:MovieFilter paging:DataPage sorting:DataSort): no[Movie!]! totalMovies: Int! }
Тип мутации
Тип mutation — это еще один корневой тип в схеме GraphQL. Мы используем его для создания определенного действия или события, которое что-то изменит в состоянии системы.
В нашем примере мы можем выполнить следующие действия
- создать фильм
- обновить фильм
- удалить фильм
type Mutation { createMovie(input:MovieInput): Movie! updateMovie(id:ID!, input:MovieInput): Movie! deleteMovie(id:ID!): Boolean! }
Другие типы
В GraphQL есть и другие типы данных, которые также полезны.
Тип input похож на тип объекта фильма, за исключением того, что он используется только для входных аргументов.
input MovieInput { title: String! year: Int! genre: MovieGenreEnum! rating: Float! }
Например, MovieInput
используется в качестве аргумента операции createMovie
и операции updateMovie
.
Тип enum — это скалярный тип, определяющий ограниченный набор значений.
enum MovieGenreEnum { ACTION ADVENTURE ANIMATION COMEDY CRIME DOCUMENTARY DRAMA FAMILY }
Встроенные скалярные типы GraphQL (Int, Float, String, Boolean, ID) очень полезны, но могут быть случаи, когда вы захотите определить свои собственные скалярные типы.
scalar Datetime
Резольвер
Схема описывает требования к данным, но не выполняет работу по получению этих данных. Резолверы справляются с этой работой.
Резолвер — это функция, которая возвращает данные для определенного поля. Функции разрешения возвращают данные в типе и форме, заданной схемой.
Преобразователь запросов
В нашем примере мы используем базу данных MongoDB для хранения данных о фильмах. Mongo — ориентированная на производительность и простая в использовании база данных NoSQL.
- В операции
movie
мы запрашиваем базу данных по идентификатору и возвращаем документ фильма, если он найден. - В операции
movies
по заданному фильтру, разбиению по страницам и сортировке он возвращает совпадающие фильмы. - В операции
totalMovies
мы возвращаем общее количество фильмов в базе данных.
Преобразователь мутаций
Преобразователь мутаций реализует три основные операции CUD (создание, обновление, удаление) в базе данных и возвращает их результат.
Тип преобразователь
Иногда нам нужно добавить пользовательские скалярные типы к нашему объекту Movie; например, нам не нужно хранить URL-адреса, поскольку их можно рассчитать по идентификатору фильма.
В этой ситуации мы можем сопоставить это поле с функциями в распознавателе типов фильмов.
Работающий сервер
Пришло время оснастить веб-сервер игровой площадкой API GraphQL.
Пользовательский интерфейс довольно дружелюбный! Теперь мы можем попытаться использовать его для выполнения всех запросов, которые мы определили.
Если вам понравилась эта статья, пожалуйста, хлопните в ладоши, чтобы другие могли ее увидеть. 💚