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.

Пользовательский интерфейс довольно дружелюбный! Теперь мы можем попытаться использовать его для выполнения всех запросов, которые мы определили.

Если вам понравилась эта статья, пожалуйста, хлопните в ладоши, чтобы другие могли ее увидеть. 💚