Рубрики
Без рубрики

Как использовать GraphQL с APOLLO на вашем сайте

В моей предыдущей статье я объяснил, почему имеет смысл отделить переднюю часть веб-сайта из задних сервисов. Я представил GraphQL, Apollo и другие инструменты, которые позволяют такую абстрацию и создавать обслуживание производственных сайтов хорошего опыта. В этой статье я покажу вам

Автор оригинала: Ondrej Polesny.

В моем Предыдущая статья Я объяснил, почему имеет смысл отделиться передней частью веб-сайта из его задних сервисов. Я представил GraphQL, Apollo и другие инструменты, которые позволяют такую абстрацию и создавать обслуживание производственных сайтов хорошего опыта.

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

Проверьте живую демонстрацию котельной

Начнем с инструментов, которые я использовал:

  • Node.js – Runtime
  • Express – Web Application Framework
  • APOLLO Server – служба промежуточного программного обеспечения с поддержкой GraphQL
  • Client Apollo – клиент GraphQL
  • Centico Cloud Tools – безголовый CMS
  • Мопс – шаблон двигатель

Первый шаг в создании сайта состоит в том, чтобы создать или создать схему. Я уже упоминал в предыдущей статье, которую я использую Content-As-A-Service Platform Kentico Cloud для хранения контента. Содержание, которое хранится там, уже структурировано в определенных модельных структурах. Поэтому я могу быстро генерировать схему, используя Генератор схемы :

KC-Generate-GQL-схема – ProjectID {ProjectID} – CreateModule

Но также возможно определить все модели вручную в следующем синтаксисе.

const type_definition = `Тип SystemInfo {ID: String! Имя: строка! Кодовое имя: строка! Язык: строка! Тип: строка! LastModified: String! } Интерфейс contentitem {система: systeminfo! } … Тип объектаBOUSCONTENTTYPE реализует ContentiteM {система: systeminfo! Описание: Ричтемпературе Название: Текстерное изображение: AssetElement} … `module.exports = {type_definition}

(Смотрите весь файл на Github .)

Модельный генератор перечисляет все типы систем, включая ссылки, тексты, поля DateTime, изображения и другие ( SystemInfo выше), за которыми следует модели данных каждого из таможенных моделей контента ( factaboutuscontenttype ). Нам нужно будет использовать определение типа в качестве модуля, поэтому последний аргумент CreateModule Отказ

Следующим шагом является создание запросов и резольдентов GraphQL. Поскольку API содержимого является только для чтения, запросы довольно просты и ограничены, чтобы получить все элементы или элементы, сгруппированные по типу:

const Querytypes = `Type Query {items: [Contentitem], itemsbytype (Тип: String!, Line: int, Глубина: int, Заказ: Строка):

(Смотрите весь файл на Github .)

И сразу после определения мы можем создать Resolver для API без головы CMS:

const disportclient (DelazeConfig); Const Resolversers = {… Query: {items: async () => {const productclient.items (). GetPromise (); возвратный ответ. Итак; }, товарыByType: async (_, {тип, предел, глубина, порядок}) => {const.items () .type (тип); предел && query.limitParameter (предел); Глубина && Query.depthparameter (глубина); заказ && query.Orderparamemeter (порядок); const query.getpromise (); возвратный ответ. Итак; }},};

(Смотрите весь файл на Github .)

Вы заметили, что запросы всегда возвращают универсальный тип Contentitem Хотя есть более конкретные типы, такие как Factaboutuscontenttenttype что наследует Contentitem определенный? Если бы вы сделали, отличная работа! Определение конкретного запроса для каждого типа будет неэффективным (их было так много). Поэтому оба наши запросы возвращаются Contentitem данные. Но как мы гарантируем, что правильные модели возвращаются во время выполнения?

Каждый элемент контента, который исходит из безгибных CMS содержит информацию о своем типе. Вы можете увидеть свойство String Тип В определении SystemInfo модель данных выше.

{“Система”: {“Тип”: “Fact_about_us” …} …}

Теперь мы знаем, что элемент содержимого имеет тип Факт_about_us что соответствует сгенерированной модели данных Factaboutuscontenttenttype Отказ Следовательно, нам нужно перевести название типа в Pascal Case и убедитесь, что GraphQL использует правильную модель данных. Мы можем гарантировать это, используя специальный Resolver для родовой модели данных:

… Const Resolversers = {ContentiTem: {__resolvetype (item, _Context, _Info) {//fact_about_us -> Фракционный const (товар);//factaboutus -> Фрактабутушка return type + ‘contenttype’; }}, …

(Смотрите весь файл на Github .)

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

…//fact_about_us -> factaboutus convertsnakeCaseTOPASCALCASE = (элемент) => {return item.system.type .split (‘_’) .map ((str) => str.slice (0, 1) .touppercas ) + str.slice (1, str.length)) .join (”); } …

(Смотрите весь файл на Github .)

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

Чтобы принести наши данные моделей, запросов и резользеров на наши данные, нам нужно создать экземпляр сервера Apollo в главной app.js Файл и подключите его с Express и нашими определениями схемы GraphQL:

const {type_definition (‘./graphql/Типы’); const {Querytypes, Resolvers (‘./graphql/queries’); const (); const apolloserver ({antrispection: true, playground: true, typedefs: [type_definition, querytypes], resolvers}); apolloserver.applymiddleware ({приложение, путь: graphqlpath});

(Смотрите весь файл на Github .)

В этом коде мы говорим Аполлон, что схема использовать. Определения предоставляются в Typedefs Массив и соответствует ранее созданным запросам и резольсам.

Остальная часть кода в app.js (опущено здесь, но вы можете взглянуть на Whole File File на GitHub ) связан с шаблоном мопса и двигателем маршрутизации. PUG позволяет создавать страницы и маршруты в структуре MVC, поэтому это легко и просто. Посмотрите на Маршруты/index.js Файл ( Файл на github ), который содержит определение единственного маршрута в проекте BoaterPlate:

… Router.get (‘/’, Async Function (_req, res, _next) {const apolloclient.warery ({query: gql` {statherbytype (Тип: “Статья”, Лимит: 3, Глубина: 0, Заказ: «Elements.post_date») {… на articlecontenttype {title {value} {Значение} teaser_image {Активы} {name url}}}}} `}); res.render (‘index’, {Статьи: Результат.itemsbytype, …});}); module.exports;

Да! Наконец, запрос графика. Вы видите, что это запрашивает все статьи, заказанные по post_date И указывает, какие поля данных должны быть предоставлены в ответе ( Название , Сводка , Teaser_image ).

Обратите внимание, что в запросе нам нужно указать, какая модель данных мы ожидаем, потому что не все дети Contentitem Должен содержать запрошенные поля (например Summary или Teaser_image ). По ... на Articlecontenttype Мы в основном создаем Переключатель Случай, который вернут определенные поля ( Название , Сводка и Teaser_image ) Если элемент возврата содержимого имеет тип Articlecontenttype Отказ

Клиент Apollo отправляет этот запрос на сервер APOLLO, который пересылает его в облачный Resolver Kentico. Resolver переводит запрос GraphQL в API для отдыха. Содержание принимает то же самое обратно в PUG, который отображает страницу в соответствии с шаблоном в Просмотров/index.pug Отказ

Как все это работает вместе? Посмотрите на Живая демонстрация Отказ

Все инструменты, которые я использовал и показал, что вам легко собрать, но зачем изобретать колесо? Когда вы хотите начать реализацию веб-сайта, используя APOLLO и RECT или любой другой JavaScript Framework, запомните эту бойную панель, чтобы сэкономить себе некоторое время и усилия. Если вы найдете что-то без вести или хотите улучшить его, не стесняйтесь Поднять проблему или Добавьте его напрямую к кодовой базе.

У вас есть опыт использования Apollo и GraphQL для отдельных проблем? Вы бы порекомендовали это другим? Дайте мне знать в комментариях.