description: Изучите, как определять и использовать маршруты в Express.js: route methods, route paths, параметры и Router для модульного роутинга.¶
Роутинг¶
Роутинг описывает, как endpoint-ы (URI) приложения отвечают на клиентские запросы. Вводный материал см. в Basic routing.
Роутинг задается методами объекта Express app, соответствующими HTTP-методам: например, app.get() для GET и app.post для POST. Полный список см. в app.METHOD. Также можно использовать app.all() для всех HTTP-методов и app.use() для подключения middleware как callback-функции (подробнее в Using middleware).
Эти методы роутинга задают callback-функцию (иногда ее называют "handler function (обработчик)"), которая вызывается, когда приложение получает запрос к указанному маршруту (endpoint) и HTTP-методу. Иными словами, приложение «слушает» запросы, соответствующие заданным маршрутам и методам, и при совпадении вызывает нужный callback.
На практике методы роутинга могут принимать несколько callback-функций. В этом случае важно передавать next в аргументах callback и вызывать next() внутри функции, чтобы передать управление следующему callback.
Следующий код — пример самого базового маршрута.
1 2 3 4 5 6 7 | |
Методы маршрутов¶
Route method соответствует одному из HTTP-методов и вызывается на экземпляре класса express.
Следующий код показывает маршруты для методов GET и POST в корне приложения.
1 2 3 4 5 6 7 8 9 | |
Express поддерживает методы для всех HTTP request methods: get, post и т. д. Полный список см. в app.METHOD.
Есть специальный метод роутинга app.all(), который подключает middleware на пути для всех HTTP request methods. Например, следующий handler выполняется для запросов к маршруту "/secret" с GET, POST, PUT, DELETE и любым другим HTTP-методом, поддерживаемым http module.
1 2 3 4 | |
Пути маршрутов¶
Route paths в сочетании с request method определяют endpoint-ы, к которым можно делать запросы. Route paths могут быть строками или регулярными выражениями.
Для сопоставления route paths Express использует path-to-regexp v8; все возможности определения route paths смотрите в документации path-to-regexp. Express Playground Router — удобный инструмент для проверки базовых маршрутов Express, хотя сопоставление шаблонов он не поддерживает.
Строковые пути¶
String paths сопоставляются с запросами строго. Символы точки (.) и дефиса (-) интерпретируются буквально.
Query string не является частью route path.
1 2 3 4 5 6 7 8 9 10 11 | |
Подстановки (wildcards)¶
Wildcards соответствуют любому пути после префикса. Они должны иметь имя, как и route parameters, и сохраняются как массив сегментов пути.
1 2 3 4 5 6 | |
Чтобы wildcard также совпадал с корневым путем, оберните его в фигурные скобки:
1 2 3 4 5 6 | |
Необязательные сегменты¶
Используйте фигурные скобки для задания необязательных сегментов в route path. Если сегмент отсутствует, параметр не попадет в req.params.
1 2 3 4 5 | |
Символы ?, +, *, [] и () зарезервированы и не могут использоваться как буквальные символы в route path. При необходимости экранируйте их через \.
Регулярные выражения¶
В качестве route path можно использовать и регулярные выражения. Это полезно, когда нужна более сложная логика сопоставления.
1 2 3 4 5 6 7 8 9 | |
Параметры маршрутов¶
Route parameters — это именованные сегменты URL, которые позволяют извлекать значения из соответствующих позиций в URL. Полученные значения заполняются в объект req.params, где ключом выступает имя параметра из пути.
1 2 3 | |
Чтобы определить маршрут с route parameters, просто укажите параметры в пути маршрута, как показано ниже.
1 2 3 | |
Имя route parameter должно состоять из «символов слова» ([A-Za-z0-9_]).
Поскольку дефис (-) и точка (.) трактуются буквально, их можно полезно сочетать с route parameters.
1 2 3 | |
1 2 3 | |
Символы regexp не поддерживаются в route paths. Вместо этого используйте массив путей или регулярные выражения. Подробнее см. в синтаксисе сопоставления route path.
Обработчики маршрутов¶
Вы можете передавать несколько callback-функций, работающих как middleware, для обработки запроса. Единственное отличие: эти callback могут вызвать next('route'), чтобы пропустить оставшиеся callback текущего маршрута. Это позволяет задать предусловия для маршрута и передать управление следующим маршрутам, если текущий не подходит.
1 2 3 4 5 6 7 8 9 10 | |
В этом примере:
GET /user/5→ обрабатывается первым маршрутом → отправляется "User 5"GET /user/0→ первый маршрут вызываетnext('route'), переходя к следующему совпадающему маршруту/user/:id
Route handlers могут быть представлены одной функцией, массивом функций или их комбинацией, как в примерах ниже.
Один callback может обрабатывать маршрут. Например:
1 2 3 | |
Маршрут может обрабатывать несколько callback-функций (не забудьте указать next). Например:
1 2 3 4 5 6 7 8 9 10 11 12 | |
Маршрут может обрабатываться массивом callback-функций. Например:
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 | |
Методы ответа¶
Методы объекта response (res) из таблицы ниже могут отправить ответ клиенту и завершить request-response цикл. Если ни один из этих методов не вызван в route handler, клиентский запрос «повиснет».
| Метод | Описание |
|---|---|
res.download() | Инициирует скачивание файла. |
res.end() | Завершает процесс отправки ответа. |
res.json() | Отправляет JSON-ответ. |
res.jsonp() | Отправляет JSON-ответ с поддержкой JSONP. |
res.redirect() | Перенаправляет запрос. |
res.render() | Рендерит шаблон представления. |
res.send() | Отправляет ответ различных типов. |
res.sendFile() | Отправляет файл как octet stream. |
res.sendStatus() | Устанавливает статус ответа и отправляет его строковое представление в теле ответа. |
app.route()¶
С помощью app.route() можно создавать цепочки route handler-ов для одного route path. Путь задается в одном месте, что упрощает модульность и снижает дублирование и вероятность опечаток. Подробнее см. в документации Router().
Ниже пример цепочки route handler-ов, объявленной через app.route().
1 2 3 4 5 6 7 8 9 10 | |
express.Router¶
Используйте класс express.Router для создания модульных route handler-ов, которые можно монтировать. Экземпляр Router — полноценная система middleware и роутинга, поэтому его часто называют «мини-приложением».
Следующий пример создает роутер как модуль, подключает в нем middleware, определяет несколько маршрутов и монтирует модуль роутера на путь в основном приложении.
Создайте в каталоге приложения файл роутера birds.js со следующим содержимым:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
Затем подключите модуль роутера в приложении:
1 2 3 4 5 | |
Теперь приложение сможет обрабатывать запросы к /birds и /birds/about, а также вызывать middleware timeLog, относящийся к этому маршруту.
Но если родительский маршрут /birds содержит path parameters, они по умолчанию недоступны в подмаршрутах. Чтобы сделать их доступными, передайте опцию mergeParams в конструктор Router.
1 | |