Добрый день! В этом блоге вы узнаете, как использовать graphql-code-directive для написания Javascript непосредственно в вашей схеме GraphQL 😲. Если вы заинтригованы или просто хотите знать, что я курил, то, возможно, вам следует продолжить чтение…

Почему?

Хороший вопрос.

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

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

Затем у вас есть небольшие преобразователи, например; вы хотите загрузить элементы в загрузчик данных и/или если у вас есть преобразователь полей с очень небольшим количеством кода, который можно было бы просто написать встроенным.

Наконец, простота разработки. Иногда вам просто нужен GraphQL API очень быстро. Вы даже можете захотеть вернуть некоторые случайные данные, которые вы могли бы жестко закодировать, и использование этой директивы позволит вам очень быстро создавать прототипы! Используя директиву, вам не нужно на самом деле писать или подключать какие-либо резольверы, и все это можно сделать в одном файле 💁‍♂️.

Покажи мне пример 🧐

Конечно! Во-первых, давайте использовать некоторые примеры данных. Ниже я собираюсь настроить сервер Apollo с запросом todos, возвращающим некоторые жестко закодированные данные, в этом примере я использую «обычный преобразователь» Javascript:

Если бы вы использовали graphql-code-directive, вы могли бы удалить константу resolvers и просто написать typeDefs :

Внедрение зависимости

Теперь вы увидели, как возвращать жестко закодированные данные, давайте рассмотрим, как мы можем внедрить что-то внутрь директивы кода.

Аргументы резольвера

Внутри исходного кода у вас есть доступ к четырем глобальным переменным:

  1. rootValue
  2. args
  3. context
  4. resolveInfo

Так, например, если бы вы написали «обычный» преобразователь Javascript, переменные сопоставлялись бы с каждым аргументом:

Использование контекста

Теперь мы знаем, что каждый аргумент преобразователя является глобальной переменной. При использовании директивы давайте посмотрим, как мы можем использовать возможности contextvariable. За кулисами я установил node-fetch и здесь я импортирую его, а затем вставляю в контекст GraphQL, чтобы затем его можно было использовать внутри директивы кода:

Вот те же определения типов с подсветкой GraphQL:

Я использую JSON-заполнитель todos API.

Покажи мне это на практике

Теперь мы знаем, как вводить вещи в контекст и как мы можем взаимодействовать с API-заполнителем JSON, давайте теперь поместим полный API GraphQL поверх этого API:

Затем, если бы вы использовали эту схему, вы могли бы запросить так:

Вопросы-Ответы

Как это работает?

Исходный код упаковывается в IFFE и передается в Виртуальную машину Node.js.

Это безопасно?

Убедитесь, что вы отключили самоанализ, и да, это безопасно. Вы контролируете, к чему имеет доступ виртуальная машина, через «контекст», и команда Node.js проделала хорошую работу по изоляции виртуальной машины.

Могу ли я проверить это?

Модульное тестирование может стать громоздким, потому что вам придется анализировать определения в AST, чтобы получить доступ к источнику. Однако вы можете написать надежные интеграционные тесты, почему бы не проверить Тестирование серверов Apollo?

Плавник

Спасибо за чтение, нарушайте правила и пишите Javascript в свой файл GraphQL. Привет 🍻

https://github.com/danstarns/graphql-code-directive