Связь между интерфейсом и сервером является очень важным аспектом любого веб-приложения. В этом примере я покажу вам, что внедрить GraphQL для нового проекта и даже добавить его в существующий не так сложно, как вы думаете.
С GraphQL данные, которые вам нужны для определенной части вашего внешнего интерфейса, могут быть получены за один вызов, даже если данные должны быть загружены из нескольких источников.
В этом очень простом мини-учебнике я буду использовать javascript, но также поддерживаются все основные языки программирования.
Что нам нужно для запуска запроса graphql? Давайте выясним это с помощью этого очень простого запроса с одним единственным полем:
{ ping }
Ответ также будет одним полем:
{ "data": { "ping": "pong" } }
Первое, что нам нужно сделать, это настроить веб-сервер, здесь я буду использовать экспресс фреймворк.
Чтобы сервер мог обрабатывать запросы graphql, нам нужно определить типы, преобразователи и, конечно же, установить некоторые библиотеки graphql.
- Определения типов
Каждое поле в ваших запросах должно соответствовать полю в определениях типов. Объект Тип запроса содержит все поля верхнего уровня, это «корневой» объект, который мы должны определить первым.
const typeDefs = gql` type Query { ping:String } `;
Теперь Graphql знает, что запрос «ping» должен возвращать строку, следующим шагом является определение значения этой строки с помощью преобразователя.
2. Резолверы
Преобразователь — это функция, которая возвращает значение, которое будет присвоено определенному полю:
const resolvers = { Query: { ping: () => 'pong' } };
Функция разрешения может принимать до 4 параметров, но в нашем простом примере они не нужны, поэтому мы просто используем стрелочную функцию.
3. Графический сервер
Нам нужно установить пакеты npm apollo-server-express вместе с graphql.
const express = require('express'); const { ApolloServer, gql } = require('apollo-server-express'); const gpserver = new ApolloServer({ typeDefs, resolvers }); await gpserver.start(); const app = express(); gpserver.applyMiddleware({ app }); await new Promise(resolve => app.listen({ port: 4000 }, resolve)); console.log(`🚀 Server ready at http://localhost:4000${gpserver.graphqlPath}`);
После запуска сервера вы можете использовать инструмент studio.apollographql.com, чтобы начать отправлять запросы.
Объекты и скаляры
Скаляры — это данные с одним полем: String, Boolean, ID, Int и Float.
Объект может состоять из нескольких полей. Допустим, мы хотим создать чек из продуктового магазина. Здесь ShoppingBag и ShopItem — этодва типа объектов GraphQL с двумя полями каждый.
Давайте добавим новое поле в корневой объект запроса: квитанция с типом ShoppingBag:теперь мы можем запрашивать поля shop и items в нашем запросе.
Обратите внимание, что поле items предполагает массив объектов ShopItem.
const typeDefs = gql` type ShoppingBag { shop: String items:[ShopItem] } type ShopItem { name: String price: Float } type Query { ping: String receipt: ShoppingBag } `;
Graphql всегда ищет дополнительные преобразователи, когда поле является типом объекта. Здесь нам нужен набор распознавателей для объекта ShoppingBag:
const resolvers = { Query: { ping: () => 'pong', receipt: () => { return { shop:"Wallmart" }; } }, ShoppingBag: { shop(obj){ return obj.shop; }, items(obj){ return [ { name:"Water", price:20.5 }, { name:"Milk", price:30.5 } ] ; } } };
Вот наш запрос «чека покупки»:
{ receipt{ shop items{ name price } } }
А вот ответ от graphql:
{ "data": { "receipt": { "shop": "Wallmart", "items": [ { "name": "Water", "price": 20.5 }, { "name": "Milk", "price": 30.5 } ] } } }
Если были ошибки, они отображались под ключом ошибки перед данными.
Базы данных
Если ваши данные хранятся в базе данных, вы можете использовать конструктор context, чтобы связать клиент базы данных, чтобы вы могли использовать его в своих преобразователях.
Помните: не используйте обратные вызовы внутри преобразователей, используйте только промисы.
const gpserver = new ApolloServer({ typeDefs, resolvers, context: async ()=>({ db: dbcli }) });
Внешняя часть
Как только все будет готово на стороне сервера, вы можете использовать Apollo Client и получить доступ к хукам реагирования на ваши запросы graphql. Сочетание возможностей react с graphql позволит вам легко добавлять новые функции.
Спасибо за чтение! Теперь вы готовы выполнить свой первый запрос graphql и даже можете приступить к созданию собственных типов и преобразователей.