Маршрутизация ExpressJS¶
Маршрутизация определяет, как приложение отвечает на клиентский запрос к конкретному адресу (URI). Вводную информацию о маршрутизации можно найти в разделе Основы маршрутизации.
Приведенный ниже код служит примером одного из самых простых маршрутов.
1 2 3 4 5 6 7 | |
Методы Route¶
Метод route является производным от одного из методов HTTP и присоединяется к экземпляру класса express.
Приведенный ниже код служит примером маршрутов, определенных для методов запросов GET и POST к корневому каталогу приложения.
1 2 3 4 5 6 7 8 9 | |
Express поддерживает перечисленные далее методы маршрутизации, соответствующие методам HTTP: get, post, put, head, delete, options, trace, copy, lock, mkcol, move, purge, propfind, proppatch, unlock, report, mkactivity, checkout, merge, m-search, notify, subscribe, unsubscribe, patch, search и connect.
Для методов route, преобразуемых в недействительные имена переменных JavaScript, используйте нотацию в квадратных скобках. Например, app['m-search']('/', function ...
Существует особый метод маршрутизации, app.all(), не являющийся производным от какого-либо метода HTTP. Этот метод используется для загрузки функций промежуточной обработки в пути для всех методов запросов.
В приведенном ниже примере обработчик будет запущен для запросов, адресованных "/secret", независимо от того, используется ли GET, POST, PUT, DELETE или какой-либо другой метод запроса HTTP, поддерживаемый в модуле http.
1 2 3 4 | |
Пути маршрутов¶
Пути маршрутов, в сочетании с методом запроса, определяют конкретные адреса (конечные точки), в которых могут быть созданы запросы. Пути маршрутов могут представлять собой строки, шаблоны строк или регулярные выражения.
В Express для сопоставления путей маршрутов используется path-to-regexp; в документации к path-to-regexp описаны все возможные варианты определения путей маршрутов. Express Route Tester - удобный инструмент для тестирования простых маршрутов в Express, хотя и не поддерживает сопоставление шаблонов.
Строки запросов не являются частью пути маршрута.
Ниже приводятся примеры путей маршрутов на основе строк.
Данный путь маршрута сопоставляет запросы с корневым маршрутом, /.
1 2 3 | |
Данный путь маршрута сопоставляет запросы с /about.
1 2 3 | |
Данный путь маршрута сопоставляет запросы с /random.text.
1 2 3 | |
Ниже приводятся примеры путей маршрутов на основе шаблонов строк.
Приведенный ниже путь маршрута сопоставляет acd и abcd.
1 2 3 | |
Этот путь маршрута сопоставляет abcd, abbcd, abbbcd и т. д.
1 2 3 | |
Этот путь маршрута сопоставляет abcd, abxcd, abRABDOMcd, ab123cd и т. д.
1 2 3 | |
Данный путь маршрута сопоставляет /abe и /abcde.
1 2 3 | |
Символы ?, +, * и () представляют собой подмножества соответствующих им регулярных выражений. Дефис (-) и точка (.) интерпретируются буквально в путях на основе строк.
Примеры путей маршрутов на основе регулярных выражений:
Данный путь маршрута сопоставляет любой элемент с "a" в имени маршрута.
1 2 3 | |
Данный маршрут сопоставляет butterfly и dragonfly, но не butterflyman, dragonfly man и т. д.
1 2 3 | |
Обработчики маршрутов¶
Для обработки запроса можно указать несколько функций обратного вызова, подобных middleware. Единственным исключением является то, что эти обратные вызовы могут инициировать next('route') для обхода остальных обратных вызовов маршрута. С помощью этого механизма можно включить в маршрут предварительные условия, а затем передать управление последующим маршрутам, если продолжать работу с текущим маршрутом не нужно.
Обработчики маршрутов могут принимать форму функции, массива функций или их сочетания, как показано в примерах ниже.
Одна функция обратного вызова может обрабатывать один маршрут. Например:
1 2 3 | |
Один маршрут может обрабатываться несколькими функциями обратного вызова (обязательно укажите объект next). Например:
1 2 3 4 5 6 7 8 9 10 11 12 | |
Массив функций обратного вызова может обрабатывать один маршрут. Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
Маршрут может обрабатываться сочетанием независимых функций и массивов функций. Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
Методы ответа¶
Методы в объекте ответа (res), перечисленные в таблице ниже, могут передавать ответ клиенту и завершать цикл "запрос-ответ". Если ни один из этих методов не будет вызван из обработчика маршрута, клиентский запрос зависнет.
| Метод | Описание |
|---|---|
| res.download() | Приглашение загрузки файла. |
| res.end() | Завершение процесса ответа. |
| res.json() | Отправка ответа JSON. |
| res.jsonp() | Отправка ответа JSON с поддержкой JSONP. |
| res.redirect() | Перенаправление ответа. |
| res.render() | Вывод шаблона представления. |
| res.send() | Отправка ответа различных типов. |
| res.sendFile() | Отправка файла в виде потока октетов. |
| res.sendStatus() | Установка кода состояния ответа и отправка представления в виде строки в качестве тела ответа. |
app.route()¶
Метод app.route() позволяет создавать обработчики маршрутов, образующие цепочки, для пути маршрута. Поскольку путь указан в одном расположении, удобно создавать модульные маршруты, чтобы минимизировать избыточность и количество опечаток. Дополнительная информация о маршрутах приводится в документации Router().
Ниже приведен пример объединенных в цепочку обработчиков маршрутов, определенных с помощью функции app.route().
1 2 3 4 5 6 7 8 9 10 | |
express.Router¶
С помощью класса express.Router можно создавать модульные, монтируемые обработчики маршрутов. Экземпляр Router представляет собой комплексную систему промежуточных обработчиков и маршрутизации; по этой причине его часто называют "мини-приложением".
В приведенном ниже примере создается маршрутизатор в виде модуля, в него загружается функция промежуточной обработки, определяется несколько маршрутов, и модуль маршрутизатора монтируется в путь в основном приложении.
Создайте файл маршрутизатора с именем birds.js в каталоге приложения со следующим содержанием:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
Потом загрузите модуль маршрутизации в приложение:
1 2 3 | |
Данное приложение теперь сможет обрабатывать запросы, адресованные ресурсам /birds и /birds/about, а также вызывать специальную функцию промежуточной обработки timeLog данного маршрута.