Hapi.js - это богатый фреймворк для создания приложений и сервисов. В данной статье я проведу несколько экспериментов с фреймворком Hapi.js. Я покажу несколько простых сценариев использования фреймворка. В качестве справочника я использую Make Me Hapi, который представляет собой самостоятельный семинар по обучению хапи. Я нашел его чрезвычайно полезным для изучения основ Hapi.js, и в этой статье я объясню официальные решения для упражнений семинара. В некоторых случаях я модифицировал официальные решения, поэтому они не всегда будут выполняться мастерской.
Эта статья - первая часть из двух частей.
Ключевые слова: Node.js, NPM, Javascript, Hapi.js, HTTP, Linux, Ubuntu, Template Engine, Inert, Path, Vision, Handlebars.js, H2o2, маршрутизация, статические файлы, каталоги, шаблоны, прокси-сервер
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: МНЕНИЯ И МНЕНИЯ, ВЫРАЖЕННЫЕ В ДАННОЙ СТАТЬЕ, ЯВЛЯЮТСЯ ЭТИМИ АВТОРА И НЕ ОТРАЖАЮТ ОФИЦИАЛЬНУЮ ПОЛИТИКУ ИЛИ ПОЛОЖЕНИЕ РАБОТОДАТЕЛЯ АВТОРА. СТАТЬЯ НЕ ПОДДЕРЖИВАЕТСЯ, НЕ ПОДДЕРЖИВАЕТСЯ, НЕ ПОДДЕРЖИВАЕТСЯ, РАЗРЕШЕНО ИЛИ СПОНСИРУЕТСЯ КАКОЙ-ЛИБО КОРПОРАЦИЕЙ ИЛИ ОРГАНИЗАЦИЕЙ. ИНФОРМАЦИЯ, СОДЕРЖАЩАЯСЯ В ДАННОЙ СТАТЬЕ, ИСКЛЮЧИТЕЛЬНО ПРЕДНАЗНАЧЕНА ДЛЯ ОБЕСПЕЧЕНИЯ ОБЩИХ УКАЗАНИЙ ПО ИНТЕРЕСНЫМ ВОПРОСАМ ДЛЯ ЛИЧНОГО ИСПОЛЬЗОВАНИЯ ЧИТАТЕЛЯ, КОТОРЫЙ НЕСЕТ ПОЛНУЮ ОТВЕТСТВЕННОСТЬ ЗА ЕГО ИСПОЛЬЗОВАНИЕ. ХОТЯ АВТОР ПРИНЯЛ ВСЕ УСИЛИЯ, ЧТОБЫ УБЕДИТЬСЯ, ЧТО ИНФОРМАЦИЯ В ДАННОЙ СТАТЬЕ БЫЛА ПРАВИЛЬНОЙ НА ВРЕМЯ НАПИСАНИЯ, АВТОР НЕ НЕСЕТ И НАСТОЯЩИЙ ОТКАЗЫВАЕТСЯ ОТ ЛЮБОЙ ОТВЕТСТВЕННОСТИ ПЕРЕД ЛЮБОЙ СТОРОНОЙ ЗА ЛЮБЫЕ УБЫТКИ, ПОВРЕЖДЕНИЯ ИЛИ ПОВРЕЖДЕНИЯ. , ЯВЛЯЮТСЯ ЛИ ТАКИЕ ОШИБКИ ИЛИ ПРОБЛЕМЫ РЕЗУЛЬТАТОМ НЕБРЕЖНОСТИ, АВАРИИ ИЛИ ЛЮБОЙ ДРУГОЙ ПРИЧИНЫ.
Языки программирования, технологии
В этой статье рассматриваются следующие языки программирования и технологии:
- JavaScript
- Node.js
- hapi.js
- HTTP
- Linux
Используются следующие модули узлов и библиотеки Javascript:
- hapi.js
- инертный
- путь (основной модуль)
- зрение
- handlebars.js
- h2o2
Оглавление
Статья разделена на следующие разделы:
- Подготовка, предпосылки
- 1 .: Простой сервер
- 2 .: Простая маршрутизация
- 3 .: Обслуживание статических файлов
- 4 .: Справочники
- 5 .: Шаблоны
- 6 .: Прокси
- 7 .: Вспомогательные скрипты
- Заключительные слова
- Лицензия
- использованная литература
Подготовка, предпосылки
Среда разработки, которую я использую, основана на Ubuntu Linux 14.04.5 LTS (trusty)
, Nodejs v11.3.0
, npm 6.4.1
, nvm 0.33.11
. Я предполагаю, что они установлены в вашей системе. Я использую среду Cloud 9.
Чтобы установить Hapi, вам нужно запустить
npm install hapi
Версия Hapi, которую я использую, 17.8.1
.
В этих примерах я использую process.env.IP
и process.env.PORT
вместо localhost
и 8080
. Это из-за среды Cloud 9.
1 .: Простой сервер
Сначала это пример простого веб-сервера.
Приложение отобразит в браузере текст «Привет, хапи». Важно понаблюдать за тем, как запустить сервер. Он передается асинхронной функции, и сервер запускается с await server.start()
.
Дальнейшее чтение:
Async / await
Для более удобной работы с обещаниями существует специальный синтаксис, который называется« async / await . Удивительно… javascript.info »
2 .: Простая маршрутизация
В предыдущем примере '/'
был предоставлен как атрибут path
. Пути могут содержать именованные параметры. В приведенном ниже примере имя параметра name
, и оно возвращается при доступе с request.params.name
.
О encodeURIComponent()
: согласно документации, он кодирует компонент унифицированного идентификатора ресурса (URI), заменяя каждый экземпляр определенных символов одной, двумя, тремя или четырьмя escape-последовательностями, представляющими кодировку UTF-8 символа символ (будет только четыре escape-последовательности для символов, состоящих из двух «суррогатных символов) ».
Дальнейшее чтение:
3 .: Обслуживание статических файлов
Для отправки статических файлов клиенту необходим дополнительный модуль. Это модуль inert
(текущая версия - 5.1.2
), который устанавливается вместе с:
npm install inert
В этом примере используется дополнительный модуль, которым является основной модульpath
. Этот пример также содержит файл HTML.
Сервер обслуживает index.html
клиента, когда к нему обращаются по пути /
.
Решение 1
Мне нужно было изменить кодировку, потому что внутренний модуль должен быть зарегистрирован на сервере. Поэтому server.route()
вызовов помещается в инициализацию. В конце концов, я поставил вызов Hapi.Server()
еще и при инициализации.
Важно позаботиться о правильном пути к файлу на сервере, для этого нам нужно использовать Path.join(__dirname, 'index.html');
.
Я оставил здесь код из предыдущего примера, чтобы также обслуживались пути типа /name
.
Решение 2
В качестве альтернативного решения можно настроить базовый путь на вашем сервере и передавать только относительный путь. Базовый путь можно указать в routes
. Таким образом, я могу использовать index.html
без указания абсолютного пути.
4 .: Справочники
С помощью обработчика каталога можно получить доступ к файлу в каталоге с другим путем в URL-адресе. Это позволяет указать один маршрут для обслуживания нескольких файлов. Приведенный ниже маршрут ответит на любой запрос путем поиска подходящего имени файла в каталоге /foo/bar/baz
. Но он ответит HTTP 403, если доступ к самому каталогу осуществляется без файла в пути. С помощью выделенной части кода это можно исправить:
server.route({ path: '/foo/bar/baz/{param*}', method: 'GET', handler: { directory: { path: Path.join(__dirname, 'public'), index: ['index.html', 'default.html'] } } });
Когда нет доступного индексного файла, inert может отображать содержимое каталога в виде страницы со списком. Вы можете включить это, установив listing
property на true
следующим образом:
server.route({ path: '/foo/bar/baz/{param*}', method: 'GET', handler: { directory: { path: Path.join(__dirname, 'public'), listing: true } } });
(Две указанные выше функции не включены в приведенный ниже пример.)
В этом примере ниже у нас есть file.html
в каталоге /public
сервера, и мы обращаемся к этому файлу по пути /foo/bar/baz/file.html
. (Мы также могли получить доступ к другим файлам по тому же пути /public
.)
5 .: Шаблоны
В этом упражнении показаны возможности создания шаблонов с помощью Hapi.js. Для этого используются два дополнительных модуля:
- зрение
- handlebars.js
Давайте установим это:
node install vision handlebars
В этом примере инертный модуль не нужен.
Плагин Vision необходимо зарегистрировать на сервере:
// Register Vision plugin await server.register(Vision);
Также необходимо зарегистрировать модуль Handlebars, чтобы шаблоны работали. Handlebars - это движок, отвечающий за отрисовку шаблонов с расширением .html
.
// Register Handlebars to handle templates server.views({ engines: { html: Handlebars }, path: Path.join(__dirname, 'templates') });
В этом примере сервер вызывается с /?name=World
, и он будет обрабатывать шаблоны в каталоге /templates
. Как видно, index.html
- это специальный файл HTML, содержащий ссылки, которые может обрабатывать Handlebars.js. В {{query.name}}
указывается параметр name
, и его содержимое помещается на HTML-страницу, которая отправляется обратно клиенту.
Реализация следующая:
6 .: Прокси
В этом упражнении реализован прокси-сервер. Для этого модуля нужен h2o2
.
npm install -g h2o2
H2O2 - обработчик прокси для Hapi.js. Для этого упражнения есть 2 сценария. Первый сервер - это прокси-сервер, работающий на порту 8080, который подключается к другому серверу. При доступе к прокси-серверу по пути /proxy
он подключится к другому серверу. Другой сервер работает на порту 65535. Этот будет обслуживать HTML-страницу. Два сервера необходимо запускать одновременно.
В следующих фрагментах кода файл index.html
обслуживается целевым сервером - под целевым сервером я имею в виду сервер, к которому обращается прокси-сервер.
Скрипт makemehapi-exercise-6-proxy.js
содержит реализацию прокси-сервера. Для этого потребуется h2o2
и установить прокси в обработчике маршрута сервера /proxy
. Этот сценарий нужно запускать с node makemehapi-exercise-6-proxy.js
.
Сценарий makemehapi-exercise-6-target.js
является «целевым» сервером. Это нужно запускать с node makemehapi-exercise-6-target.js 65535
.
В компьютерных сетях прокси-сервер - это сервер (компьютерная система или приложение), который действует как посредник для запросов от клиентов, ищущих ресурсы с других серверов. Клиент подключается к прокси-серверу, запрашивая какую-либо услугу, например файл, соединение, веб-страницу или другой ресурс, доступный с другого сервера, и прокси-сервер оценивает запрос как способ упростить и контролировать его сложность.
Связь между двумя компьютерами (показаны серым), подключенными через третий компьютер (показан красным), выступающим в качестве прокси. Боб не знает, кому идет информация, поэтому для защиты конфиденциальности можно использовать прокси. (Источник: Википедия)
7 .: Вспомогательные скрипты
Дополнительная литература: Просмотры, раздел« Помощники просмотра ».
В Hapi.js можно определить помощников просмотра. Это вспомогательные функции, которые можно использовать в шаблонах. В следующем примере приложение распечатывает имя плода, для которого из URL-адреса получен параметр.
В приведенном ниже примере helper.js
должен находиться в папке helpers
. Эта папка помощников зарегистрирована на сервере со следующим:
server.views({ engines: { html: Handlebars }, path: __dirname, helpersPath: Path.join(__dirname, 'helpers') });
Помощник - реализация функции, которая возвращает значение, которое затем будет использоваться в шаблоне при обращении к помощнику. Например, простой файл helper.js
в папке helpers
выглядит следующим образом:
module.exports = function (context) { value = ""; // ... implementation here ... // returning the value return value; };
Контекст передается вспомогательному методу.
В шаблоне на это ссылается имя помощника. Например, в теге p
:
<p>{{helper}}</p>
Во вспомогательной реализации с помощью context.data.root.query
можно получить доступ к параметрам запроса в URL-адресе. Например в URL
https://localhost/?fruitName=3
к значению fruitName
можно получить доступ с помощью:
context.data.root.query.fruitName
Пример помощников выглядит следующим образом. В этом примере fruits.js
должен находиться в папке helpers
.
Заключительные слова
Надеюсь, вы узнали что-то новое сегодня. Спасибо, что прочитали эту статью.
Лицензия
Фрагменты кода, использованные в этой статье, основаны на оригинальных решениях для мастерской, поэтому я воспроизвожу здесь лицензию мастерской makemehapi. Это актуально для фрагментов кода, опубликованных в этой статье.
Copyright (c) 2012-2014, Walmart and other contributors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * The names of any contributors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * The complete list of contributors can be found at: https://github.com/hapijs/makemehapi/graphs/contributors
Исходная версия лицензии: