Содержание

Часть III: Создание бессерверной функции для хеширования

В этом посте мы возьмем функцию хеширования, реализованную в предыдущем посте, и переместим ее в Функции Graphcool.

Функции должны быть определены в файле определения службы Graphcool (graphcool.yml). Graphcool поддерживает следующие типы функций, которые могут быть вызваны либо как веб-перехватчики, либо как управляемые функции:

До и после операций (_2 _ / _ 3_)

Чтобы это работало, вам необходимо указать операцию в модели, для которой должна быть вызвана функция. Например: Link.update, Link.delete или Link.create. Примером того, когда можно использовать этот тип, является то, что мы хотели бы реализовать функцию, которая не позволяет определенным пользователям создавать ссылки, количество которых превышает X. Мы могли бы использовать operationBefore на Link.create и запустить функцию, которая проверяет, сколько ссылок уже создано пользователем, и либо выдаст ошибку, либо разрешит создание.

Подписки

Для подписки требуется запрос подписки, который определяет, когда функция должна запускаться (например, при создании, обновлении или удалении объекта). После мутации выполняется функция поддержки. Примером этого может быть, если мы хотим отправлять приветственное письмо каждый раз, когда новый пользователь регистрируется.

Резольверы

Резольверы - самые мощные типы, поскольку они позволяют вам придумать новое определение мутации и / или запроса. Мы будем использовать преобразователи в одном из следующих постов, где мы создадим мутацию для регистрации и входа в систему пользователей, а также запрос, который возвращает вошедшего в систему пользователя.

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

Вариант 1. Использование operationBefore / operationAfter

Мы могли бы использовать любой из этих двух вариантов. Нам нужно будет изменить CreateLinkMutation в CreateShortLink.js, чтобы удалить переменную $hash, а также сделать поле хеширования необязательным в схеме. Затем мы переместим функцию createHash в бэкэнд, чтобы либо обновить созданную ссылку хешем (если мы используем operationAfter), либо создать хеш и вернуть его для завершения мутации, если мы используем operationBefore.

Вариант 2. Использование подписки

Как и в предыдущем случае, нам нужно удалить переменную $hash из CreateLinkMutation и написать запрос подписки, который запускается при создании новой ссылки - у нас уже есть этот запрос, поэтому мы можем обновить его следующим образом:

subscription NewLinkCreatedSubscription {
  Link(filter: { mutation_in: [CREATED] })
    node {
      id
    }
  }
}

В функции-обработчике мы получим данные, возвращенные из подписки (id), затем мы получим количество всех ссылок, создадим хэш и, наконец, обновим существующую ссылку с помощью этой мутации:

mutation UpdateLinkWithHash($id: String!, $hash: String!) {
  updateLink(id: $id, hash: $hash) {
    id  
  } 
}

Вариант 3. Использование резольвера

С помощью преобразователя мы расширили бы наш существующий API с помощью новой мутации под названием createHashMutation. Функция, которая будет выполняться при вызове этой мутации, будет проходить аналогично, как если бы мы использовали подписку. Функция получит количество созданных ссылок, сгенерирует хеш, а затем вернет этот сгенерированный хеш. Затем мы могли бы вызвать наш существующий CreateLinkMutation и передать хеш, который мы из createHashMutation.

Поскольку позже мы будем использовать преобразователь для аутентификации пользователей, давайте воспользуемся подпиской, чтобы реализовать это - вариант 2 это так!

Перенести хеш-функцию в подписку

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

  1. Создайте папку graphcool/src в корне вашего проекта
  2. Добавьте createShortLink.graphql файл со следующей подпиской, которая срабатывает каждый раз при создании ссылки и возвращает ее идентификатор:
subscription {
  Link(filter: { mutation_in: [CREATED] }) {
    node {
      id
    }
  }
}

3. Добавьте createShortLink.js файл, который запускается каждый раз при создании новой ссылки.

4. Установите зависимости для функции подписки, выполнив следующую команду из папки graphcool, где находится файл package.json:

$ npm install graphcool-lib --save

5. Обновите graphcool.yml для ссылки на созданный нами файл graphql и js:

functions:
  createShortLink:
    type: subscription
    query: src/createShortLink.graphql
    handler:
      code: src/createShortLink.js

6. Разверните изменения и создайте подписку:

$ graphcool deploy
...
Subscription Functions
createShortLink
   + A new subscription with the name `createShortLink` is created.

Перед тем, как опробовать подписку, сделаем пару вещей:

  1. Удалите createHash функцию, $hash переменную из мутации и GET_LINK_COUNT_QUERY из CreateShortLink.js. Ниже представлен обновленный файл:

2. Сделайте поле hash в types.graphql необязательным, удалив восклицательный знак:

type Link @model {
  id: ID! @isUnique
  hash: String
  url: String!
  description: String
}

Снова запустите graphcool deploy, чтобы обновить тип, и мы готовы проверить это!

Запустите веб-сайт (yarn start), если он еще не запущен, и попробуйте создать новую ссылку - все должно работать точно так же, как и раньше, с той лишь разницей, что функция хеширования теперь вызывается как часть подписки на связь. Чтобы действительно убедиться, что это работает, вы можете запустить graphcool logs, чтобы получить журналы вызовов из ваших функций. Выглядит это так:

Тестирование функции

Если произошла ошибка, здесь вы также получите подробную информацию об ошибке. Второй вариант просмотра журналов и вызовов функций - перейти на http://graph.cool, щелкнуть Функции, а затем - функцию createShortLink, чтобы получить все журналы.

Еще одна полезная команда для тестирования функций - это команда graphcool invoke-local из интерфейса командной строки. Вместо того, чтобы просматривать наш веб-сайт для создания новых ссылок, мы можем напрямую отправить полезные данные JSON в функцию следующим образом:

$ graphcool invoke-local --function createShortLink --json event.json

Где event.json может выглядеть так:

{
  "data": {
    "Link": {
      "node": {
        "id": "LINK_ID"
       }
     }
  }
}

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

Приближается

В следующем посте серии мы поработаем над получением короткой статистики URL - количества кликов. Для этого нам понадобится обработчик ссылок. Например: если мы генерируем хэш «ABC123», нам нужно будет написать код, который будет выполняться, когда пользователь посещает «http: // localhost: 3000 / ABC123», и преобразовать этот хеш в реальную ссылку и перенаправить пользователя на нее. . Получив обработчик, мы можем начать сбор статистики по кликам.

Спасибо за прочтение!

Любые отзывы об этих сериях более чем приветствуются! Вы также можете подписаться на меня в Twitter и GitHub. Если вам понравилось это и вы хотите получать уведомления, когда будут готовы другие части, подпишитесь на мою рассылку!