Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Node.js
Code

Введение в генераторы и Koa.js: часть 2

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Introduction to Generators & Koa.js.
Introduction to Generators & Koa.js: Part 1

Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)

Final product image
What You'll Be Creating

Добро пожаловать во вторую часть нашей серии по генераторам и Koa. Если вы его пропустили, вы можете прочитать здесь часть 1. Перед началом разработки убедитесь, что вы установили Node.js 0.11.9 или выше.

В этой части мы создадим API словаря с использованием Koa.js, и вы узнаете о маршрутизации, сжатии, протоколировании, ограничении скорости и обработке ошибок в Koa.js. Мы также будем использовать Mongo в качестве нашего хранилища данных и кратко расскажем об импорте данных в Mongo и о легкости, которая приходит с запросом в Koa. Наконец, мы рассмотрим отладку приложений Koa.

Понимание Коа

Коа имеет радикальные изменения под капотом, которые используют генераторы ES6. Помимо изменения в потоке управления, Koa вводит свои собственные пользовательские объекты, такие как this,  this.request и this.response, которые удобно действуют как слой синтаксического сахара, созданный поверх объектов req и res Node, предоставляя вам доступ к различным методам удобства и геттерам / сеттерам.

Помимо удобства, Koa также очищает middleware, которые в Express, полагались на уродливые хаки, которые часто меняли основные объекты. Он также обеспечивает лучшую обработку потока.

Подождите, что такое middleware?

Middleware - это подключаемая функция, которая добавляет или удаляет определенную функциональность, выполняя некоторую работу в объектах request / response в Node.js.

Middleware Коа

Middleware Коа - это, по существу, функция генератора, которая возвращает одну функцию генератора и принимает другую. Обычно приложение имеет серию middleware, которое запускается для каждого запроса.

Кроме того, middleware должно йелдить следующее midlleware «вниз по течению». Мы более подробно поговорим об этом в разделе обработки ошибок.

Создание middleware

И еще одно последнее замечание: для добавления middleware в ваше приложение Koa мы используем метод koa.use() и предоставляем функцию middleware в качестве аргумента. Пример: app.use(koa-logger) добавляет koa-logger в список middleware, которое использует наше приложение.

Создание приложения

Чтобы начать с API словаря, нам нужен рабочий набор определений. Чтобы воссоздать этот реальный сценарий, мы решили использовать реальный набор данных. Мы взяли дамп определения из Википедии и загрузили его в Монго. Набор состоял из около 700 000 слов, поскольку мы импортировали только английский дамп. Каждая запись (или документ) состоит из слова, его типа и его значения. Подробнее о процессе импорта можно узнать в файле import.txt в репозитории.

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

Мы можем начать с создания базового сервера Koa:

В первой строке мы импортируем Koa и сохраняем экземпляр в переменной приложения. Затем мы добавляем одно middleware в строке 5, которое является анонимной функцией генератора, которая принимает следующую переменную в качестве параметра. Здесь мы устанавливаем тип и код состояния ответа, который также автоматически определяется, но мы также можем установить их вручную. Затем, наконец, мы устанавливаем тело ответа.

Поскольку мы установили тело в нашем первом middleware, это будет означать конец каждого цикла запросов, и никакое другое middleware не будет задействовано. Наконец, мы запускаем сервер, вызывая его метод listen и передавая номер порта в качестве параметра.

Мы можем запустить сервер, запустив скрипт через:

Вы можете напрямую достичь этого этапа, перейдя к комиту 6858ae0:

Добавление возможностей маршрутизации

Маршрутизация позволяет перенаправлять различные запросы на различные функции на основе типа запроса и URL-адреса. Например, мы можем захотеть ответить на /login иначе, чем на signup . Это можно сделать, добавив middleware, которое вручную проверяет URL-адрес полученного запроса и запускает соответствующие функции. Или вместо ручного написания этого middleware мы можем использовать middleware сообщества, также известное как модуль пmiddleware.

Чтобы добавить возможности маршрутизации в наше приложение, мы будем использовать модуль сообщества с именем koa-router.

Чтобы использовать koa-router, мы изменим существующий код на код, показанный ниже:

Здесь мы импортировали два модуля, в которых router хранит koa-router и mount хранит модуль koa-mount, позволяя нам использовать маршрутизатор в нашем приложении Koa.

В строке 6 мы определили нашу функцию handler, которая является той же функцией, что и раньше, но здесь мы дали ей имя. В строке 12 мы сохраняем экземпляр маршрутизатора в APIv1, а в строке 13 мы регистрируем наш обработчик для всех запросов GET по маршруту /all.

Таким образом, все запросы, кроме случаев, когда запрос на получение отправляется на localhost:3000/all  вернут «не найден». Наконец, в строке 15 мы используем middleware mount, которое дает полезную функцию генератора, которая может быть передана app.use().

Чтобы выполнить этот шаг или сравнить ваше приложение, выполните следующую команду в клонированном репозатории:

Прежде чем запустить наше приложение, нам нужно установить koa-router и koa-mount с помощью npm. Мы видим, что по мере увеличения сложности нашего приложения число модулей / зависимостей также увеличивается.

Чтобы отслеживать всю информацию о проекте и делать данные доступными для npm, мы сохраняем всю информацию в package.json, включая все зависимости. Вы можете создать package.json вручную или с помощью интерфейса интерактивной командной строки, который открывается с помощью команды $ npm init.

Очень минимальный файл package.json выглядит так, как показано выше.

Как только package.json присутствует, вы можете сохранить зависимость, используя следующую команду:

Например: в этом случае мы будем устанавливать модули, используя следующую команду для сохранения зависимостей в package.json.

Теперь вы можете запустить приложение, используя команду $ node --harmony index.js.

Вы можете узнать больше о package.json здесь.

Добавление маршрутов для API словаря

Мы начнем с создания двух маршрутов для API, один для получения одного результата в более быстром запросе, а второй для получения всех совпадающих слов (что будет медленнее в первый раз).

Чтобы сохранить управляемость, мы будем хранить все функции API в отдельной папке api и файле api.js и импортировать их позже в нашем основном файле index.js.

Здесь мы используем co-monk, который действует как обертка вокруг monk, поэтому нам очень легко делать запросы к MongoDB с помощью генераторов в Koa. Здесь мы импортируем monk и co-monk и подключаемся к экземпляру MongoDB в строке 3. Мы вызываем wrap() в коллекции, чтобы сделать их генераторами.

Затем мы добавляем два метода генератора по имени all и single как свойство переменной exports, чтобы их можно было импортировать в другие файлы. В каждой из функций сначала проверяем параметр запроса «word». Если присутствует, мы запрашиваем результат, иначе мы отвечаем с ошибкой 404.

Мы используем ключевое слово yield для ожидания результатов, как описано в первой статье, что приостанавливает выполнение до получения результата. В строке 12 мы используем метод find, который возвращает все совпадающие слова, которые сохраняются в res и затем отправляются обратно. В строке 23 мы используем метод findOne, доступный в коллекции, который возвращает первый результат сопоставления.

Назначение этих обработчиков маршрутам

Здесь мы импортируем экспортированные методы из api.js и назначаем обработчики GET маршрутам /all /single, и у нас есть полностью функциональный API и приложение.

Чтобы запустить приложение, вам просто нужно установить модули monk и co-monk, используя приведенную ниже команду. Кроме того, убедитесь, что у вас есть исполняемый экземпляр MongoDB, в который вы импортировали коллекцию, присутствующую в репозитории git, с помощью инструкций, упомянутых в файле import.txtweird.

Теперь вы можете запустить приложение, используя следующую команду:

Вы можете открыть браузер и открыть следующие URL-адреса, чтобы проверить работу приложения. Просто замените «new» на слово, которое вы хотите запросить.

  • http://localhost:3000/v1/all?word=new
  • http://localhost:3000/v1/single?word=new

Чтобы выполнить этот шаг или сравнить ваше приложение, выполните следующую команду в клонированном репозитории:

Обработка ошибок в Koa

Используя каскадные middleware, мы можем ловить ошибки с помощью механизма try/catch, так как каждое middleware может реагировать, уступая как вниз, так и вверх по течению. Таким образом, если мы добавим middleware Try and Catch в начале приложения, оно поймает все ошибки, обнаруженные в запросе в остальной части middleware, поскольку это будет последнее middleware во время восходящего потока. Добавление следующего кода в строке 10 или ранее в index.js должно работать.

Добавление логирования и ограничения скорости в приложение

Хранение логов является неотъемлемой частью современного приложения, поскольку логи очень полезны при отладке и поиске проблем в приложении. Они также хранят все действия и, таким образом, могут быть использованы для выяснения моделей активности пользователей и интересных других шаблонов.

Ограничение скорости также стало неотъемлемой частью современных приложений, где важно оградить спамеров и ботов от растраты ваших драгоценных серверных ресурсов.

Довольно легко добавить логирование и ограничение скорости в наше приложение Koa. Мы будем использовать два модуля сообщества: koa-logger и koa-better-rate-limit. Нам нужно добавить следующий код в наше приложение:

Здесь мы импортировали два модуля и добавили их в качестве middleware. Логер будет логировать каждый запрос и печатать на stdout, который может быть легко сохранен в файле. А limit middleware ограничивает количество запросов, которые данный пользователь может запросить в заданный таймфрейм (здесь это максимум десять запросов за три минуты). Также вы можете добавить массив IP-адресов, которые будут занесены в черный список, и их запрос не будет обработан.

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

Сжатие трафика

Одним из способов обеспечить более быструю доставку является gzip вашего ответа, который довольно прост в Koa. Чтобы сжать ваш трафик в Коа, вы можете использовать модуль koa-compress.

Здесь параметры могут быть пустым или могут быть настроены в соответствии с требованием.

Вы даже можете отключить сжатие в запросе, добавив следующий код в промежуточное ПО:

Не забудьте установить compress с помощью npm.

Чтобы выполнить этот шаг или сравнить ваше приложение, выполните следующую команду в клонированном репозитории:

Пишем тесты

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

Мы будем хранить наш тест в test.js в папке api. В обоих тестах мы сначала описываем наш тест, предоставляя ему более понятное для человека имя. После этого мы передадим анонимную функцию, которая описывает правильное поведение теста и принимает обратный вызов, который содержит фактический тест. В каждом тесте мы импортируем наше приложение, запускаем сервер, описываем тип запроса, URL и запрос, а затем устанавливаем кодировку в gzip. Наконец, мы проверяем ответ, если он правильный.

Чтобы запустить наш тест, мы создадим Makefile:

Здесь мы настроили репортера (nyan cat) и фреймворк тестирования (mocha). Обратите внимание, что импорт должен добавить --harmony, чтобы включить режим ES6. Наконец, мы также указываем местоположение всех тестов. Makefile можно настроить для бесконечного тестирования вашего приложения.

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

Просто не забудьте установить тестовые модули (mocha, should, supertest) перед тестированием, используя следующую команду:

Работа в продакшене

Чтобы запустить наши приложения на проде, мы будем использовать PM2, который является полезным монитором процесса Node. Мы должны отключить приложение logger во время прода; он может быть автоматизирован с использованием переменных среды.

Чтобы установить PM2, введите следующую команду в терминал

И наше приложение можно запустить с помощью следующей команды:

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

Заключение

Коа - легкое и выразительное middleware для Node.js, что делает процесс написания веб-приложений и API более приятным.

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

Пожалуйста, не стесняйтесь оставлять комментарии, вопросы или другую информацию в поле ниже.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.