Книга: Выразительный JavaScript
Маршрутизация
Маршрутизация
Для запуска сервера будет использоваться http.createServer
. В функции, обрабатывающей новый запрос, мы должны различать запросы (определяемые методом и путём), которые мы поддерживаем. Это можно сделать через длинную цепочку if
/ else
, но можно и красивее.
Маршрутизатор – компонент, помогающий распределить запрос к функции, которая может его обработать. Можно сказать маршрутизатору, что запросы PUT
с путём, совпадающим с регуляркой /^/talks/(/+)$/
(что совпадает с /talks/
, за которым идёт название темы), могут быть обработаны заданной функцией. Кроме того, он может помочь извлечь осмысленные части пути, в нашем случае – название темы, заключённое в кавычки, и передать их вспомогательной функции.
В NPM есть много хороших модулей маршрутизации, но тут мы сами себе такой напишем, чтобы продемонстрировать принцип его работы.
Вот файл router.js
, который будет запрашиваться через require
из модуля сервера:
var Router = module.exports = function() {
this.routes = [];
};
Router.prototype.add = function(method, url, handler) {
this.routes.push({method: method,
url: url,
handler: handler});
};
Router.prototype.resolve = function(request, response) {
var path = require("url").parse(request.url).pathname;
return this.routes.some(function(route) {
var match = route.url.exec(path);
if (!match || route.method != request.method)
return false;
var urlParts = match.slice(1).map(decodeURIComponent);
route.handler.apply(null, [request, response]
.concat(urlParts));
return true;
});
};
Модуль экспортирует конструктор Router
. Объект router
позволяет регистрировать новые обработчики с методом add
, и распределять запросы методом resolve
.
Последний вернёт булевское значение, показывающее, был ли найден обработчик. Метод some
массива путей будет пробовать их по очереди (в порядке, в каком они были заданы), и остановится с возвратом true
, если путь найден.
Функции обработчиков вызываются с объектами request
и response
. Когда регулярка, проверяющая URL, возвращает группы, то представляющие их строки передаются в обработчик в качестве дополнительных аргументов. Эти строчки надо декодировать из URL-стиля %20
.
- 14.12.2. Маршрутизация от источника
- 6.16.4 Маршрутизация от источника и безопасность
- Глава 8 Маршрутизация в IP
- 3.5 Маршрутизация в IP
- 6.6 Маршрутизация по следующему попаданию
- 6.12.1 Адаптивная маршрутизация
- 6.16.1 Маршрутизация от источника
- 8.3 Маршрутизация в IP
- 8.12.1 Маршрутизация в IGRP
- 8.12.4 Внешняя маршрутизация
- 8.13.2 Маршрутизация в области OSPF
- 8.13.5 Маршрутизация через грань области OSPF