@e22m4u/js-trie-router 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README-ru.md +240 -0
- package/README.md +96 -93
- package/package.json +20 -21
package/README-ru.md
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
## @e22m4u/js-trie-router
|
|
2
|
+
|
|
3
|
+
*[English](./README.md) | Русский*
|
|
4
|
+
|
|
5
|
+
HTTP роутер для Node.js на основе
|
|
6
|
+
[префиксного дерева](https://ru.wikipedia.org/wiki/Trie) (trie).
|
|
7
|
+
|
|
8
|
+
- Поддержка [path-to-regexp](https://github.com/pillarjs/path-to-regexp) синтаксиса.
|
|
9
|
+
- Автоматический парсинг JSON-тела запроса.
|
|
10
|
+
- Парсинг строки запроса и заголовка `cookie`.
|
|
11
|
+
- Поддержка `preHandler` и `postHandler` хуков.
|
|
12
|
+
- Позволяет использовать асинхронные обработчики.
|
|
13
|
+
|
|
14
|
+
## Установка
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm install @e22m4u/js-trie-router
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Для загрузки ES-модуля требуется установить `"type": "module"` в файле
|
|
21
|
+
`package.json`, или использовать `.mjs` расширение.
|
|
22
|
+
|
|
23
|
+
## Обзор
|
|
24
|
+
|
|
25
|
+
Базовый пример создания экземпляра роутера, объявления маршрута
|
|
26
|
+
и передачи слушателя запросов `http` серверу.
|
|
27
|
+
|
|
28
|
+
```js
|
|
29
|
+
import http from 'http';
|
|
30
|
+
import {TrieRouter} from '@e22m4u/js-trie-router';
|
|
31
|
+
|
|
32
|
+
const server = new http.Server(); // создание экземпляра HTTP сервера
|
|
33
|
+
const router = new TrieRouter(); // создание экземпляра роутера
|
|
34
|
+
|
|
35
|
+
router.defineRoute({
|
|
36
|
+
method: 'GET', // метод запроса "GET", "POST" и т.д.
|
|
37
|
+
path: '/', // шаблон пути, пример "/user/:id"
|
|
38
|
+
handler(ctx) { // обработчик маршрута
|
|
39
|
+
return 'Hello world!';
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
server.on('request', router.requestListener); // подключение роутера
|
|
44
|
+
server.listen(3000, 'localhost'); // прослушивание запросов
|
|
45
|
+
|
|
46
|
+
// Open in browser http://localhost:3000
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Контекст запроса
|
|
50
|
+
|
|
51
|
+
Первый параметр обработчика маршрута принимает экземпляр класса
|
|
52
|
+
`RequestContext` с набором свойств, содержащих разобранные
|
|
53
|
+
данные входящего запроса.
|
|
54
|
+
|
|
55
|
+
- `container: ServiceContainer` экземпляр [сервис-контейнера](https://npmjs.com/package/@e22m4u/js-service)
|
|
56
|
+
- `req: IncomingMessage` нативный поток входящего запроса
|
|
57
|
+
- `res: ServerResponse` нативный поток ответа сервера
|
|
58
|
+
- `params: ParsedParams` объект ключ-значение с параметрами пути
|
|
59
|
+
- `query: ParsedQuery` объект ключ-значение с параметрами строки запроса
|
|
60
|
+
- `headers: ParsedHeaders` объект ключ-значение с заголовками запроса
|
|
61
|
+
- `cookie: ParsedCookie` объект ключ-значение разобранного заголовка `cookie`
|
|
62
|
+
- `method: string` метод запроса в верхнем регистре, например `GET`, `POST` и т.д.
|
|
63
|
+
- `path: string` путь включающий строку запроса, например `/myPath?foo=bar`
|
|
64
|
+
- `pathname: string` путь запроса, например `/myMath`
|
|
65
|
+
|
|
66
|
+
Пример доступа к контексту из обработчика маршрута.
|
|
67
|
+
|
|
68
|
+
```js
|
|
69
|
+
router.defineRoute({
|
|
70
|
+
method: 'GET',
|
|
71
|
+
path: '/users/:id',
|
|
72
|
+
handler(ctx) {
|
|
73
|
+
// GET /users/10?include=city
|
|
74
|
+
// Cookie: foo=bar; baz=qux;
|
|
75
|
+
console.log(ctx.req); // IncomingMessage
|
|
76
|
+
console.log(ctx.res); // ServerResponse
|
|
77
|
+
console.log(ctx.params); // {id: 10}
|
|
78
|
+
console.log(ctx.query); // {include: 'city'}
|
|
79
|
+
console.log(ctx.headers); // {cookie: 'foo=bar; baz=qux;'}
|
|
80
|
+
console.log(ctx.cookie); // {foo: 'bar', baz: 'qux'}
|
|
81
|
+
console.log(ctx.method); // "GET"
|
|
82
|
+
console.log(ctx.path); // "/users/10?include=city"
|
|
83
|
+
console.log(ctx.pathname); // "/users/10"
|
|
84
|
+
// ...
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Отправка ответа
|
|
90
|
+
|
|
91
|
+
Возвращаемое значение обработчика маршрута используется в качестве ответа
|
|
92
|
+
сервера. Тип значения влияет на представление возвращаемых данных. Например,
|
|
93
|
+
если результатом будет являться тип `object`, то такое значение автоматически
|
|
94
|
+
сериализуется в JSON.
|
|
95
|
+
|
|
96
|
+
| value | content-type |
|
|
97
|
+
|-----------|--------------------------|
|
|
98
|
+
| `string` | text/plain |
|
|
99
|
+
| `number` | application/json |
|
|
100
|
+
| `boolean` | application/json |
|
|
101
|
+
| `object` | application/json |
|
|
102
|
+
| `Buffer` | application/octet-stream |
|
|
103
|
+
| `Stream` | application/octet-stream |
|
|
104
|
+
|
|
105
|
+
Пример возвращаемого значения обработчиком маршрута.
|
|
106
|
+
|
|
107
|
+
```js
|
|
108
|
+
router.defineRoute({ // регистрация маршрута
|
|
109
|
+
// ...
|
|
110
|
+
handler(ctx) { // обработчик входящего запроса
|
|
111
|
+
return {foo: 'bar'}; // ответ будет представлен в виде JSON
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Контекст запроса `ctx` содержит нативный экземпляр класса `ServerResponse`
|
|
117
|
+
модуля `http`, который может быть использован для ручного управления ответом.
|
|
118
|
+
|
|
119
|
+
```js
|
|
120
|
+
router.defineRoute({
|
|
121
|
+
// ...
|
|
122
|
+
handler(ctx) {
|
|
123
|
+
res.statusCode = 404;
|
|
124
|
+
res.setHeader('content-type', 'text/plain; charset=utf-8');
|
|
125
|
+
res.end('404 Not Found', 'utf-8');
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Хуки маршрута
|
|
131
|
+
|
|
132
|
+
Определение маршрута методом `defineRoute` позволяет задать хуки
|
|
133
|
+
для отслеживания и перехвата входящего запроса и ответа
|
|
134
|
+
конкретного маршрута.
|
|
135
|
+
|
|
136
|
+
- `preHandler` выполняется перед вызовом обработчика
|
|
137
|
+
- `postHandler` выполняется после вызова обработчика
|
|
138
|
+
|
|
139
|
+
#### preHandler
|
|
140
|
+
|
|
141
|
+
Перед вызовом обработчика маршрута может потребоваться выполнение
|
|
142
|
+
таких операции как авторизация и проверка параметров запроса. Для
|
|
143
|
+
этого можно использовать хук `preHandler`.
|
|
144
|
+
|
|
145
|
+
```js
|
|
146
|
+
router.defineRoute({ // регистрация маршрута
|
|
147
|
+
// ...
|
|
148
|
+
preHandler(ctx) {
|
|
149
|
+
// перед обработчиком маршрута
|
|
150
|
+
console.log(`Incoming request ${ctx.method} ${ctx.path}`);
|
|
151
|
+
// > incoming request GET /myPath
|
|
152
|
+
},
|
|
153
|
+
handler(ctx) {
|
|
154
|
+
return 'Hello world!';
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Если хук `preHandler` возвращает значение отличное от `undefined` и `null`,
|
|
160
|
+
то такое значение будет использовано в качестве ответа сервера, а вызов
|
|
161
|
+
обработчика маршрута будет пропущен.
|
|
162
|
+
|
|
163
|
+
```js
|
|
164
|
+
router.defineRoute({ // регистрация маршрута
|
|
165
|
+
// ...
|
|
166
|
+
preHandler(ctx) {
|
|
167
|
+
// возвращение ответа сервера
|
|
168
|
+
return 'Are you authorized?';
|
|
169
|
+
},
|
|
170
|
+
handler(ctx) {
|
|
171
|
+
// данный обработчик не будет вызван, так как
|
|
172
|
+
// хук "preHandler" уже отправил ответ
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
#### postHandler
|
|
178
|
+
|
|
179
|
+
Возвращаемое значение обработчика маршрута передается вторым аргументом
|
|
180
|
+
хука `postHandler`. По аналогии с `preHandler`, если возвращаемое
|
|
181
|
+
значение отличается от `undefined` и `null`, то такое значение будет
|
|
182
|
+
использовано в качестве ответа сервера. Это может быть полезно для
|
|
183
|
+
модификации возвращаемого ответа.
|
|
184
|
+
|
|
185
|
+
```js
|
|
186
|
+
router.defineRoute({
|
|
187
|
+
// ...
|
|
188
|
+
handler(ctx) {
|
|
189
|
+
return 'Hello world!';
|
|
190
|
+
},
|
|
191
|
+
postHandler(ctx, data) {
|
|
192
|
+
// после обработчика маршрута
|
|
193
|
+
return data.toUpperCase(); // HELLO WORLD!
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Глобальные хуки
|
|
199
|
+
|
|
200
|
+
Экземпляр роутера `TrieRouter` позволяет задать глобальные хуки, которые
|
|
201
|
+
имеют более высокий приоритет перед хуками маршрута, и вызываются
|
|
202
|
+
в первую очередь.
|
|
203
|
+
|
|
204
|
+
- `preHandler` выполняется перед вызовом обработчика каждого маршрута
|
|
205
|
+
- `postHandler` выполняется после вызова обработчика каждого маршрута
|
|
206
|
+
|
|
207
|
+
Добавить глобальные хуки можно методом `addHook` экземпляра роутера,
|
|
208
|
+
где первым параметром передается название хука, а вторым его функция.
|
|
209
|
+
|
|
210
|
+
```js
|
|
211
|
+
router.addHook('preHandler', (ctx) => {
|
|
212
|
+
// перед обработчиком маршрута
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
router.addHook('postHandler', (ctx, data) => {
|
|
216
|
+
// после обработчика маршрута
|
|
217
|
+
});
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Аналогично хукам маршрута, если глобальный хук возвращает значение
|
|
221
|
+
отличное от `undefined` и `null`, то такое значение будет использовано
|
|
222
|
+
как ответ сервера.
|
|
223
|
+
|
|
224
|
+
## Отладка
|
|
225
|
+
|
|
226
|
+
Установка переменной `DEBUG` перед командой запуска включает вывод логов.
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
DEBUG=jsTrieRouter* npm run test
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## Тестирование
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
npm run test
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## Лицензия
|
|
239
|
+
|
|
240
|
+
MIT
|
package/README.md
CHANGED
|
@@ -1,68 +1,69 @@
|
|
|
1
1
|
## @e22m4u/js-trie-router
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
[Trie](https://en.wikipedia.org/wiki/Trie)
|
|
5
|
-
для разрешения маршрутов.
|
|
3
|
+
*English | [Русский](./README-ru.md)*
|
|
6
4
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
- Парсинг строки запроса и заголовка `cookie`.
|
|
10
|
-
- Поддержка `preHandler` и `postHandler` хуков.
|
|
11
|
-
- Позволяет использовать асинхронные обработчики.
|
|
5
|
+
HTTP router for Node.js based on
|
|
6
|
+
a [prefix tree](https://en.wikipedia.org/wiki/Trie) (trie).
|
|
12
7
|
|
|
13
|
-
|
|
8
|
+
- Supports [path-to-regexp](https://github.com/pillarjs/path-to-regexp) syntax.
|
|
9
|
+
- Parses JSON request body automatically.
|
|
10
|
+
- Parses query string and `cookie` header.
|
|
11
|
+
- Supports `preHandler` and `postHandler` hooks.
|
|
12
|
+
- Supports asynchronous handlers.
|
|
13
|
+
|
|
14
|
+
## Installation
|
|
14
15
|
|
|
15
16
|
```bash
|
|
16
17
|
npm install @e22m4u/js-trie-router
|
|
17
18
|
```
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
`package.json
|
|
20
|
+
To load the ES-module, you need to set `"type": "module"`
|
|
21
|
+
in the `package.json` file, or use the `.mjs` extension.
|
|
21
22
|
|
|
22
|
-
##
|
|
23
|
+
## Overview
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
A basic example of creating a router instance, defining
|
|
26
|
+
a route and startup Node.js HTTP server.
|
|
26
27
|
|
|
27
28
|
```js
|
|
28
29
|
import http from 'http';
|
|
29
|
-
import {TrieRouter} from '@e22m4u/js-
|
|
30
|
+
import {TrieRouter} from '@e22m4u/js-trie-router';
|
|
30
31
|
|
|
31
|
-
const server = new http.Server(); //
|
|
32
|
-
const router = new TrieRouter(); //
|
|
32
|
+
const server = new http.Server(); // Node.js HTTP server
|
|
33
|
+
const router = new TrieRouter(); // TrieRouter instance
|
|
33
34
|
|
|
34
|
-
router.defineRoute({
|
|
35
|
-
method: 'GET', //
|
|
36
|
-
path: '/', //
|
|
37
|
-
handler(ctx) { //
|
|
35
|
+
router.defineRoute({ // route definition
|
|
36
|
+
method: 'GET', // request method "GET", "POST", etc.
|
|
37
|
+
path: '/', // path template, example "/user/:id"
|
|
38
|
+
handler(ctx) { // route handler
|
|
38
39
|
return 'Hello world!';
|
|
39
40
|
},
|
|
40
41
|
});
|
|
41
42
|
|
|
42
|
-
server.on('request', router.requestListener); //
|
|
43
|
-
server.listen(3000, 'localhost'); //
|
|
43
|
+
server.on('request', router.requestListener); // inject request listener
|
|
44
|
+
server.listen(3000, 'localhost'); // listen for requests
|
|
44
45
|
|
|
45
46
|
// Open in browser http://localhost:3000
|
|
46
47
|
```
|
|
47
48
|
|
|
48
|
-
###
|
|
49
|
+
### Request context
|
|
49
50
|
|
|
50
|
-
|
|
51
|
-
`RequestContext`
|
|
52
|
-
|
|
51
|
+
The first parameter of a route handler is an instance
|
|
52
|
+
of the `RequestContext` class which has a properties
|
|
53
|
+
set with contents of a parsed incoming request.
|
|
53
54
|
|
|
54
|
-
- `container: ServiceContainer`
|
|
55
|
-
- `req: IncomingMessage`
|
|
56
|
-
- `res: ServerResponse`
|
|
57
|
-
- `params: ParsedParams`
|
|
58
|
-
- `query: ParsedQuery`
|
|
59
|
-
- `headers: ParsedHeaders`
|
|
60
|
-
- `cookie: ParsedCookie`
|
|
61
|
-
- `method: string`
|
|
62
|
-
- `path: string`
|
|
63
|
-
- `pathname: string`
|
|
55
|
+
- `container: ServiceContainer` instance of [service container](https://npmjs.com/package/@e22m4u/js-service)
|
|
56
|
+
- `req: IncomingMessage` native incoming request stream
|
|
57
|
+
- `res: ServerResponse` native server response stream
|
|
58
|
+
- `params: ParsedParams` key-value object with path parameters
|
|
59
|
+
- `query: ParsedQuery` key-value object with query string parameters
|
|
60
|
+
- `headers: ParsedHeaders` key-value object with request headers
|
|
61
|
+
- `cookie: ParsedCookie` key-value object of parsed `cookie` header
|
|
62
|
+
- `method: string` request method in uppercase, e.g. `GET`, `POST`, etc.
|
|
63
|
+
- `path: string` path including query string, e.g. `/myPath?foo=bar`
|
|
64
|
+
- `pathname: string` request path, e.g. `/myMath`
|
|
64
65
|
|
|
65
|
-
|
|
66
|
+
Example of accessing the context from a route handler.
|
|
66
67
|
|
|
67
68
|
```js
|
|
68
69
|
router.defineRoute({
|
|
@@ -85,12 +86,12 @@ router.defineRoute({
|
|
|
85
86
|
});
|
|
86
87
|
```
|
|
87
88
|
|
|
88
|
-
###
|
|
89
|
+
### Response sending
|
|
89
90
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
91
|
+
Return value of a route handler is used as response data.
|
|
92
|
+
Value type affects representation of a response data. For example,
|
|
93
|
+
if a response data is of type `object`, it will be automatically
|
|
94
|
+
serialized to JSON.
|
|
94
95
|
|
|
95
96
|
| value | content-type |
|
|
96
97
|
|-----------|--------------------------|
|
|
@@ -101,19 +102,20 @@ router.defineRoute({
|
|
|
101
102
|
| `Buffer` | application/octet-stream |
|
|
102
103
|
| `Stream` | application/octet-stream |
|
|
103
104
|
|
|
104
|
-
|
|
105
|
+
Example of sending data as JSON.
|
|
105
106
|
|
|
106
107
|
```js
|
|
107
|
-
router.defineRoute({ //
|
|
108
|
+
router.defineRoute({ // register a route
|
|
108
109
|
// ...
|
|
109
|
-
handler(ctx) { //
|
|
110
|
-
return {foo: 'bar'}; //
|
|
110
|
+
handler(ctx) { // incoming request handler
|
|
111
|
+
return {foo: 'bar'}; // response will be encoded to JSON
|
|
111
112
|
},
|
|
112
113
|
});
|
|
113
114
|
```
|
|
114
115
|
|
|
115
|
-
|
|
116
|
-
|
|
116
|
+
The request context `ctx` contains a native instance
|
|
117
|
+
of the `ServerResponse` class from the `http` module,
|
|
118
|
+
which can be used for manual response management.
|
|
117
119
|
|
|
118
120
|
```js
|
|
119
121
|
router.defineRoute({
|
|
@@ -126,28 +128,28 @@ router.defineRoute({
|
|
|
126
128
|
});
|
|
127
129
|
```
|
|
128
130
|
|
|
129
|
-
###
|
|
131
|
+
### Route hooks
|
|
130
132
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
133
|
+
Defining a route with the `defineRoute` method allows
|
|
134
|
+
to set up hooks to monitor and intercept requests and
|
|
135
|
+
responses for a specific route.
|
|
134
136
|
|
|
135
|
-
- `preHandler`
|
|
136
|
-
- `postHandler`
|
|
137
|
+
- `preHandler` executes before a route handler
|
|
138
|
+
- `postHandler` executes after a route handler
|
|
137
139
|
|
|
138
140
|
#### preHandler
|
|
139
141
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
142
|
+
Before calling a route handler, operations such as authorization
|
|
143
|
+
and request validation may be performed in the `preHandler`
|
|
144
|
+
hook.
|
|
143
145
|
|
|
144
146
|
```js
|
|
145
|
-
router.defineRoute({ //
|
|
147
|
+
router.defineRoute({ // register a route
|
|
146
148
|
// ...
|
|
147
149
|
preHandler(ctx) {
|
|
148
|
-
//
|
|
149
|
-
console.log(`
|
|
150
|
-
//
|
|
150
|
+
// before the route handler
|
|
151
|
+
console.log(`incoming request ${ctx.method} ${ctx.path}`);
|
|
152
|
+
// > incoming request GET /myPath
|
|
151
153
|
},
|
|
152
154
|
handler(ctx) {
|
|
153
155
|
return 'Hello world!';
|
|
@@ -155,85 +157,86 @@ router.defineRoute({ // регистрация маршрута
|
|
|
155
157
|
});
|
|
156
158
|
```
|
|
157
159
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
160
|
+
A route handler will not be called if `preHandler` hook
|
|
161
|
+
returns a value other than `undefined` and `null`, because
|
|
162
|
+
that value will be sent as response data.
|
|
161
163
|
|
|
162
164
|
```js
|
|
163
|
-
router.defineRoute({ //
|
|
165
|
+
router.defineRoute({ // register a route
|
|
164
166
|
// ...
|
|
165
167
|
preHandler(ctx) {
|
|
166
|
-
//
|
|
168
|
+
// return the response data
|
|
167
169
|
return 'Are you authorized?';
|
|
168
170
|
},
|
|
169
171
|
handler(ctx) {
|
|
170
|
-
//
|
|
171
|
-
//
|
|
172
|
+
// this handler will not be called
|
|
173
|
+
// because the "preHandler" hook
|
|
174
|
+
// has already sent the data
|
|
172
175
|
},
|
|
173
176
|
});
|
|
174
177
|
```
|
|
175
178
|
|
|
176
179
|
#### postHandler
|
|
177
180
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
использовано в качестве ответа сервера. Это может быть полезно для
|
|
182
|
-
модификации возвращаемого ответа.
|
|
181
|
+
Return value of a route handler is passed to the second
|
|
182
|
+
parameter of `postHandler` hook. It may be useful to modify
|
|
183
|
+
the value before being sent.
|
|
183
184
|
|
|
184
185
|
```js
|
|
185
186
|
router.defineRoute({
|
|
186
187
|
// ...
|
|
187
188
|
handler(ctx) {
|
|
189
|
+
// return the response data
|
|
188
190
|
return 'Hello world!';
|
|
189
191
|
},
|
|
190
192
|
postHandler(ctx, data) {
|
|
191
|
-
//
|
|
193
|
+
// modify the response data before send
|
|
192
194
|
return data.toUpperCase(); // HELLO WORLD!
|
|
193
195
|
},
|
|
194
196
|
});
|
|
195
197
|
```
|
|
196
198
|
|
|
197
|
-
###
|
|
199
|
+
### Global hooks
|
|
198
200
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
201
|
+
A `TrieRouter` instance allows to set up global hooks
|
|
202
|
+
that have higher priority over route hooks and are
|
|
203
|
+
called first.
|
|
202
204
|
|
|
203
|
-
- `preHandler`
|
|
204
|
-
- `postHandler`
|
|
205
|
+
- `preHandler` executes before each route handler
|
|
206
|
+
- `postHandler` executes after each route handler
|
|
205
207
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
+
Global hooks can be added using the `addHook` method
|
|
209
|
+
of a router instance, where the first parameter
|
|
210
|
+
is the hook name and the second is a function.
|
|
208
211
|
|
|
209
212
|
```js
|
|
210
213
|
router.addHook('preHandler', (ctx) => {
|
|
211
|
-
//
|
|
214
|
+
// before a route handler
|
|
212
215
|
});
|
|
213
216
|
|
|
214
217
|
router.addHook('postHandler', (ctx, data) => {
|
|
215
|
-
//
|
|
218
|
+
// after a route handler
|
|
216
219
|
});
|
|
217
220
|
```
|
|
218
221
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
+
Similar to route hooks, if a global hook returns
|
|
223
|
+
a value other than `undefined` and `null`, that
|
|
224
|
+
value will be sent as response data.
|
|
222
225
|
|
|
223
|
-
##
|
|
226
|
+
## Debugging
|
|
224
227
|
|
|
225
|
-
|
|
228
|
+
Set the `DEBUG` variable to enable log output.
|
|
226
229
|
|
|
227
230
|
```bash
|
|
228
|
-
DEBUG=
|
|
231
|
+
DEBUG=jsTrieRouter* npm run test
|
|
229
232
|
```
|
|
230
233
|
|
|
231
|
-
##
|
|
234
|
+
## Testing
|
|
232
235
|
|
|
233
236
|
```bash
|
|
234
237
|
npm run test
|
|
235
238
|
```
|
|
236
239
|
|
|
237
|
-
##
|
|
240
|
+
## License
|
|
238
241
|
|
|
239
242
|
MIT
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@e22m4u/js-trie-router",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.0.4",
|
|
4
|
+
"description": "HTTP router for Node.js based on a prefix tree",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/index.js",
|
|
7
7
|
"scripts": {
|
|
@@ -26,32 +26,31 @@
|
|
|
26
26
|
"author": "e22m4u <e22m4u@yandex.ru>",
|
|
27
27
|
"license": "MIT",
|
|
28
28
|
"homepage": "https://github.com/e22m4u/js-trie-router",
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@e22m4u/js-format": "~0.1.0",
|
|
31
|
+
"@e22m4u/js-path-trie": "~0.0.2",
|
|
32
|
+
"@e22m4u/js-service": "~0.1.0",
|
|
33
|
+
"debug": "~4.3.7",
|
|
34
|
+
"http-errors": "~2.0.0",
|
|
35
|
+
"statuses": "~2.0.1"
|
|
36
|
+
},
|
|
29
37
|
"devDependencies": {
|
|
30
|
-
"@commitlint/cli": "~19.
|
|
31
|
-
"@commitlint/config-conventional": "~19.
|
|
32
|
-
"@eslint/js": "~9.
|
|
33
|
-
"@types/chai-as-promised": "
|
|
38
|
+
"@commitlint/cli": "~19.5.0",
|
|
39
|
+
"@commitlint/config-conventional": "~19.5.0",
|
|
40
|
+
"@eslint/js": "~9.12.0",
|
|
41
|
+
"@types/chai-as-promised": "~8.0.1",
|
|
34
42
|
"c8": "~10.1.2",
|
|
35
43
|
"chai": "~5.1.1",
|
|
36
|
-
"chai-as-promised": "
|
|
37
|
-
"eslint": "~9.
|
|
44
|
+
"chai-as-promised": "~8.0.0",
|
|
45
|
+
"eslint": "~9.12.0",
|
|
38
46
|
"eslint-config-prettier": "~9.1.0",
|
|
39
47
|
"eslint-plugin-chai-expect": "~3.1.0",
|
|
40
|
-
"eslint-plugin-jsdoc": "
|
|
48
|
+
"eslint-plugin-jsdoc": "~50.3.1",
|
|
41
49
|
"eslint-plugin-mocha": "~10.5.0",
|
|
42
|
-
"globals": "~15.
|
|
43
|
-
"husky": "~9.1.
|
|
50
|
+
"globals": "~15.10.0",
|
|
51
|
+
"husky": "~9.1.6",
|
|
44
52
|
"mocha": "~10.7.3",
|
|
45
53
|
"prettier": "~3.3.3",
|
|
46
|
-
"typescript": "~5.
|
|
47
|
-
},
|
|
48
|
-
"dependencies": {
|
|
49
|
-
"@e22m4u/js-format": "^0.1.0",
|
|
50
|
-
"@e22m4u/js-path-trie": "^0.0.1",
|
|
51
|
-
"@e22m4u/js-service": "^0.0.12",
|
|
52
|
-
"debug": "^4.3.6",
|
|
53
|
-
"http-errors": "^2.0.0",
|
|
54
|
-
"path-to-regexp": "^7.1.0",
|
|
55
|
-
"statuses": "^2.0.1"
|
|
54
|
+
"typescript": "~5.6.2"
|
|
56
55
|
}
|
|
57
56
|
}
|