Простой GraphQL-запрос с использованием ExpressJs


Введение

В этой статье я собираюсь объяснить основы создания простого запроса к API с помощью GraphQL и ExpressJs.

Мы рассмотрим такие понятия, как:

  1. Создание экспресс-сервера
  2. Создание нашей схемы
  3. Тестирование запросов с помощью graphiql.

Итак, сначала создайте папку и дайте ей любое имя по вашему выбору, я назову свою simple-graphql-project.
Внутри только что созданной папки откройте терминал и выполните команду

npm init -y
Войти в полноэкранный режим Выйти из полноэкранного режима

Это инициализирует наш проект с помощью npm, чтобы мы могли установить пакеты, которые понадобятся в учебнике.

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

В терминале выполните команду

npm i express graphql express-graphql lodash axios
Войти в полноэкранный режим Выйти из полноэкранного режима

or

yarn add express graphql express-graphql lodash axios
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь, когда все пакеты установлены, давайте напишем немного кода:

Создайте файл с именем app.js — это будет наш основной файл.
Вставьте следующий код в файл app.js, затем я объясню, что он означает:

const express = require('express')
const {graphqlHTTP} = require('express-graphql')
const schema = require('./schema/schema')

const app = express()
app.use('/graphql', graphqlHTTP({
    schema,
    graphiql: true
}))

app.listen(4000, ()=> {
    console.log('Started server on port 4000');
})
Войти в полноэкранный режим Выйти из полноэкранного режима

Итак, из кода выше:

В строке 1: Мы импортировали наш пакет express, который является нашим бэкенд фреймворком для node js, чтобы создать серверы и конечные точки для нашего проекта.

В строке 2: graphqlHTTP— это модуль из express-graphql, который предоставляет простой способ создания Express сервера, который запускает GraphQL API.

В строке 3: schema file — это файл, который нам еще предстоит создать, но я могу сказать вам, что этот файл будет содержать, в нашем файле схемы будут записаны все запросы, которые мы будем делать к конечной точке API или внутреннему JSON файлу.

Например, в этих запросах мы будем извлекать точные данные, которые мы хотим получить при вызове конечной точки API, а также тип этих данных.

Например, если мы делаем запрос на получение списка записей в блоге от API, мы ожидаем, что в качестве части данных будет возвращен идентификатор каждой записи, верно? Кроме того, мы хотим указать тип данных ожидаемого ID: строка, число или булево значение.

fields: () => ({
    id: {type: GraphQLString},
    flight_number: { type: GraphQLInt },
    name: { type: GraphQLString },
    details: { type: GraphQLString },
    success: { type: GraphQLBoolean },
  }),
Вход в полноэкранный режим Выход из полноэкранного режима

Вот что я имел в виду под этим объяснением. В этом проекте мы сделаем запрос к API SpaceX, и результаты, которые мы хотим получить из огромного куска данных, которые мы получим от API, следующие: id типа string, flight_number типа int, name и details типа string и success типа boolean.

В строках 7-10: Мы передадим 2 аргумента в нашу функцию express app, первый - это наша конечная точка, с которой мы будем делать все запросы.

Второй аргумент - функция graphqlHTTP, которой мы передадим наш файл схемы, содержащий наш запрос, чтобы express мог взаимодействовать с GraphQL API, второй параметр graphiql - это инструмент, который мы будем использовать для тестирования наших запросов.

В строке 13-15: Это порт, с которого мы будем запускать наш express-сервер.

Итак, давайте теперь перейдем к нашему файлу схемы, создадим папку с именем schema и создадим файл внутри этой папки с именем schema.js.

Вставьте следующий код в файл schema.js:

const graphql = require("graphql");
const {
  GraphQLObjectType,
  GraphQLInt,
  GraphQLString,
  GraphQLSchema,
  GraphQLList,
  GraphQLBoolean,
} = graphql;
const axios = require("axios");

const LaunchType = new GraphQLObjectType({
  name: "Launch",
  fields: () => ({
    id: {type: GraphQLString},
    flight_number: { type: GraphQLInt },
    name: { type: GraphQLString },
    details: { type: GraphQLString },
    success: { type: GraphQLBoolean },
  }),
});
Вход в полноэкранный режим Выйти из полноэкранного режима

Первые 21 строка нашего кода содержат утверждения оператора импорта. Наша переменная LaunchType - это тип объекта graph, который будет содержать выбранные поля, которые мы хотим получить из нашего вызова API.

Давайте продолжим работу с кодом:

const RootQuery = new GraphQLObjectType({
  name: "RootQueryType",
  fields: {
    launch: {
      type: LaunchType,
      args: { id: { type: GraphQLString } },
      resolve(parent, args) {
        return axios
          .get(`https://api.spacexdata.com/v5/launches/${args.id}`)
          .then((res) => res.data);
      },
    },
    launches: {
      type: new GraphQLList(LaunchType),
      resolve(parent, args) {
        return axios
          .get("https://api.spacexdata.com/v5/launches")
          .then((res) => res.data);
      },
    },
  },
});
Вход в полноэкранный режим Выйти из полноэкранного режима

Объект RootQuery будет содержать два запроса, которые мы будем делать. Во-первых, мы хотим получить подробную информацию о конкретном запуске, передав id в качестве строки запроса в URL API, а второй запрос - получить подробную информацию обо всех запусках, которые были сделаны.

Итак, для первого запроса launch: мы передали тип "LaunchType", а также "args", который является аргументом/строкой запроса, который мы будем использовать для получения подробной информации о конкретном запуске. В функции resolve мы также передаем два аргумента parent и args, о родительском аргументе мы пока говорить не будем. Внутри функции resolve мы возвращаем данные, полученные в результате запроса конечной точки API.

Второй запрос - launches: если вы заметили, мы использовали тип GraphQLList, потому что мы получаем не одни данные, а несколько, поэтому мы передаем наши результаты в виде списка/массива.

После того как мы закончили писать все функции запросов, мы экспортируем наш файл схемы, чтобы использовать его в нашем файле app.js.

Поэтому включите этот код в файл schema.js:

module.exports = new GraphQLSchema({
  query: RootQuery,
});
Войти в полноэкранный режим Выход из полноэкранного режима

Теперь мы можем проверить наши запросы, зайдя в терминал и выполнив команду:

В терминале должно появиться Started server on port 4000.

Теперь откройте браузер и перейдите на localhost:4000/graphql, если вы помните, это конечная точка, которую мы создали для нашего GraphQL API.

В браузере вы должны увидеть что-то вроде этого:

Это graphiql, инструмент, который мы будем использовать для тестирования наших конечных точек:

Итак, давайте получим подробную информацию обо всех запусках, которые были произведены SpaceX:

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

Итак, мы успешно выполнили наши запросы и получили желаемый результат.

Ссылка на исходный код:

Заключение

В этом руководстве мы сделали API запрос к внешнему API, мы также можем использовать GraphQL для получения данных из JSON файла в нашем проекте, а также для более продвинутых функций.

Если вы хотите узнать больше о GraphQL, воспользуйтесь разделом комментариев, чтобы рассказать мне, о чем бы вы хотели, чтобы я написал дальше, вы также можете посмотреть мои предыдущие статьи, они вам понравятся.

Спасибо до следующего раза.

Оцените статью
devanswers.ru
Добавить комментарий