Основы GraphQL: как работает ApolloBoost
Development | Комментировать запись
В предыдущих материалах мы рассмотрели создание API-интерфейсов с помощью GraphQL и Prisma. Однако мы ни разу не применили серверный интерфейс к клиентскому приложению.
Читайте также:
В этом мануале вы узнаете, как дать пользователю возможность взаимодействовать с сервером посредством запросов и мутаций с помощью пакета Apollo Boost, который предоставляет нам готовую использования клиента Apollo среду.
Установка Apollo и зависимостей
Мы попробуем применить более общий подход и использовать Apollo без других библиотек типа React или Vue. Так что нам просто понадобится файл HTML и JavaScript с упаковщиком, чтобы мы могли использовать новейшие функции JavaScript. Пакет babel-polyfill даст нам доступ к async/await.
$ npm install parcel-bundler apollo-boost graphql babel-polyfill
Читайте также: Функции async/await в JavaScript
Настройка бэкэнда
Чтобы не уделять слишком много внимания бэкэнду, можно использовать вот этот стартер с несколькими распознавателями. Также вам понадобится база данных Postgres. Не забудьте добавить учетные данные в файл env.
Запустив все перечисленные выше вещи, вы можете запустить свой проект в отдельном терминале.
$ cd prisma
$ docker-compose up -d
$ prisma deploy
$ cd ../
$ yarn get-schema
$ yarn start
Если вы не хотите возиться с пользовательским бэкэндом, рекомендуем вам посетить GraphCMS и создать свою тестовую модель.
Запросы
Подключиться к бэкэнду очень просто. Нужно только добавить URI в ApolloBoost. Если вы работали с Gatsby раньше, вы уже должны быть хорошо знакомы с функцией gql. С помощью gql и нескольких кавычек мы можем структурировать запросы точно так же, как в GraphQL Playground.
Теперь метод query нашего сервера примет запрос и вернет промис. Для рендеринга можно разместить все в div. Имейте в виду, что это все еще код фронтэнда, поэтому мы напрямую обращаемся к элементам DOM.
Файл index.js:
import "babel-polyfill";
import ApolloBoost, { gql } from 'apollo-boost';
const server = new ApolloBoost({
uri: 'http://localhost:4000/' // Or to you GraphCMS API
});
const query = gql`
query {
posts {
title
body
}
}
`;
const render = posts => {
let html = '';
posts.data.posts.forEach(post => {
html += `
<div>
<h3>${post.title}</h3>
<p>${post.body}</p>
</div>
`;
});
document.querySelector('#posts').innerHTML = html;
};
const getPosts = async query => {
const server = new ApolloBoost({ uri: 'http://localhost:4000/' });
const posts = await server.query({ query });
render(posts);
};
getPosts(query);
Файл index.html:
<body> <div id="posts"></div> </body>
Мутации
Мутации просты до невозможности. Просто попробуйте создать обычную мутацию и передайте ее в метод mutate сервера. Мы даже можем отправлять данные с помощью формы, не настраивая стандартный сервер, поскольку это все уже есть на стороне клиента.
Файл index.html:
<body> <form id="form"> <input type="text" name="title" placeholder="Title" /> <input type="text" name="body" placeholder="Body" > <div class="controls"> <button type="submit" id="submit">Submit</button> <button type="button" id="clearPosts">Clear All</button> </div> </form> <div id="posts"></div> </body>
index.js:
const addPost = async data => {
const mutation = gql`
mutation {
addPost(data: {
title: "${data.title}",
body: "${data.body}"
}) {
title
}
}
`;
await server.mutate({ mutation });
getPosts(query);
};
const submit = document.querySelector('#submit');
const form = document.querySelector('#form');
submit.addEventListener('click', e => {
e.preventDefault()
addPost({
title: form.elements.title.value,
body: form.elements.body.value
})
form.reset()
});
Или:
const clearAll = async () => {
const mutation = gql`
mutation {
clearPosts {
count
}
}`;
const count = await server.mutate({ mutation });
console.log(`${count.data.clearPosts.count} item removed`);
getPosts(query);
};
const clearBtn = document.querySelector('#clearPosts');
clearBtn.addEventListener('click', () => clearAll());
Заключение
К сожалению, от Apollo Boost не очень много толку при работе с подписками – это значительно более сложный процесс.
Читайте также: Основы Fetch API в JavaScript
Tags: ApolloBoost, GraphQL, Prisma