@e22m4u/js-trie-router 0.4.0 → 0.4.2
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/.mocharc.cjs +1 -0
- package/README.md +49 -36
- package/dist/cjs/index.cjs +216 -157
- package/mocha-setup.js +4 -0
- package/package.json +2 -2
- package/src/debuggable-service.spec.js +1 -1
- package/src/hooks/hook-invoker.spec.js +1 -1
- package/src/hooks/hook-registry.spec.js +1 -1
- package/src/parsers/body-parser.d.ts +2 -2
- package/src/parsers/body-parser.js +6 -6
- package/src/parsers/body-parser.spec.js +2 -2
- package/src/parsers/cookies-parser.d.ts +2 -2
- package/src/parsers/cookies-parser.js +5 -5
- package/src/parsers/cookies-parser.spec.js +1 -1
- package/src/parsers/query-parser.d.ts +2 -2
- package/src/parsers/query-parser.js +5 -5
- package/src/parsers/query-parser.spec.js +1 -1
- package/src/parsers/request-parser.d.ts +2 -2
- package/src/parsers/request-parser.js +8 -8
- package/src/parsers/request-parser.spec.js +1 -1
- package/src/request-context.d.ts +13 -9
- package/src/request-context.js +75 -18
- package/src/request-context.spec.js +46 -18
- package/src/route-registry.d.ts +2 -2
- package/src/route-registry.js +7 -7
- package/src/route-registry.spec.js +1 -1
- package/src/route.js +1 -1
- package/src/route.spec.js +2 -2
- package/src/router-options.spec.js +1 -1
- package/src/senders/data-sender.d.ts +2 -2
- package/src/senders/data-sender.js +11 -11
- package/src/senders/data-sender.spec.js +1 -1
- package/src/senders/error-sender.d.ts +11 -6
- package/src/senders/error-sender.js +19 -19
- package/src/senders/error-sender.spec.js +6 -3
- package/src/trie-router.js +20 -24
- package/src/trie-router.spec.js +37 -25
- package/src/utils/clone-deep.js +1 -1
- package/src/utils/clone-deep.spec.js +1 -1
- package/src/utils/create-cookies-string.spec.js +1 -1
- package/src/utils/create-debugger.spec.js +1 -1
- package/src/utils/create-error.spec.js +1 -1
- package/src/utils/create-request-mock.js +11 -11
- package/src/utils/create-request-mock.spec.js +1 -1
- package/src/utils/create-response-mock.d.ts +2 -1
- package/src/utils/create-response-mock.js +30 -30
- package/src/utils/create-response-mock.spec.js +1 -1
- package/src/utils/create-route-mock.d.ts +19 -0
- package/src/utils/create-route-mock.js +22 -0
- package/src/utils/create-route-mock.spec.js +28 -0
- package/src/utils/fetch-request-body.d.ts +2 -2
- package/src/utils/fetch-request-body.js +16 -13
- package/src/utils/fetch-request-body.spec.js +1 -1
- package/src/utils/get-request-pathname.d.ts +2 -2
- package/src/utils/get-request-pathname.js +8 -8
- package/src/utils/get-request-pathname.spec.js +1 -1
- package/src/utils/index.d.ts +1 -0
- package/src/utils/index.js +1 -0
- package/src/utils/is-promise.spec.js +1 -1
- package/src/utils/is-readable-stream.spec.js +1 -1
- package/src/utils/is-response-sent.d.ts +2 -2
- package/src/utils/is-response-sent.js +8 -8
- package/src/utils/is-response-sent.spec.js +1 -1
- package/src/utils/is-writable-stream.spec.js +1 -1
- package/src/utils/parse-content-type.spec.js +1 -1
- package/src/utils/parse-cookies.spec.js +1 -1
- package/src/utils/to-camel-case.spec.js +1 -1
- package/src/chai.js +0 -7
package/.mocharc.cjs
CHANGED
package/README.md
CHANGED
|
@@ -53,15 +53,15 @@ const {TrieRouter} = require('@e22m4u/js-trie-router');
|
|
|
53
53
|
|
|
54
54
|
```js
|
|
55
55
|
import http from 'http';
|
|
56
|
-
import {TrieRouter} from '@e22m4u/js-trie-router';
|
|
56
|
+
import {TrieRouter, HttpMethod} from '@e22m4u/js-trie-router';
|
|
57
57
|
|
|
58
58
|
const server = new http.Server(); // создание экземпляра HTTP сервера
|
|
59
59
|
const router = new TrieRouter(); // создание экземпляра роутера
|
|
60
60
|
|
|
61
61
|
router.defineRoute({
|
|
62
|
-
method:
|
|
63
|
-
path: '/',
|
|
64
|
-
handler(ctx) {
|
|
62
|
+
method: HttpMethod.GET, // метод запроса "GET", "POST" и т.д.
|
|
63
|
+
path: '/', // шаблон пути, пример "/user/:id"
|
|
64
|
+
handler(ctx) { // обработчик маршрута
|
|
65
65
|
return 'Hello world!';
|
|
66
66
|
},
|
|
67
67
|
});
|
|
@@ -72,46 +72,55 @@ server.listen(3000, 'localhost'); // прослушивание за
|
|
|
72
72
|
// Open in browser http://localhost:3000
|
|
73
73
|
```
|
|
74
74
|
|
|
75
|
+
*i. Для указания метода запроса рекомендуется использовать
|
|
76
|
+
константу `HttpMethod`, чтобы избежать опечаток.*
|
|
77
|
+
|
|
75
78
|
### Контекст запроса
|
|
76
79
|
|
|
77
80
|
Первый параметр обработчика маршрута принимает экземпляр класса
|
|
78
81
|
`RequestContext` с набором свойств, содержащих разобранные
|
|
79
82
|
данные входящего запроса.
|
|
80
83
|
|
|
81
|
-
- `
|
|
82
|
-
- `
|
|
83
|
-
- `
|
|
84
|
-
- `
|
|
85
|
-
- `
|
|
86
|
-
- `
|
|
87
|
-
- `
|
|
88
|
-
- `
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
- `
|
|
84
|
+
- `params: ParsedParams` объект ключ-значение с параметрами пути;
|
|
85
|
+
- `query: ParsedQuery` объект ключ-значение с параметрами строки запроса;
|
|
86
|
+
- `headers: ParsedHeaders` объект ключ-значение с заголовками запроса;
|
|
87
|
+
- `cookies: ParsedCookies` объект ключ-значение разобранного заголовка `Cookie`;
|
|
88
|
+
- `method: HttpMethod` метод запроса в верхнем регистре, например `GET`, `POST` и т.д.;
|
|
89
|
+
- `path: string` путь включающий строку запроса, например `/myPath?foo=bar`;
|
|
90
|
+
- `pathname: string` путь запроса, например `/myPath`;
|
|
91
|
+
- `body: unknown` тело запроса;
|
|
92
|
+
|
|
93
|
+
Дополнительные свойства:
|
|
94
|
+
|
|
95
|
+
- `container: ServiceContainer` экземпляр [сервис-контейнера](https://npmjs.com/package/@e22m4u/js-service);
|
|
96
|
+
- `request: IncomingMessage` нативный поток входящего запроса;
|
|
97
|
+
- `response: ServerResponse` нативный поток ответа сервера;
|
|
98
|
+
- `route: Route` экземпляр текущего маршрута;
|
|
99
|
+
- `meta: object` геттер для доступа к метаданным маршрута (`route.meta`);
|
|
93
100
|
|
|
94
101
|
Пример доступа к контексту из обработчика маршрута.
|
|
95
102
|
|
|
96
103
|
```js
|
|
97
104
|
router.defineRoute({
|
|
98
|
-
method:
|
|
105
|
+
method: HttpMethod.GET,
|
|
99
106
|
path: '/users/:id',
|
|
100
107
|
meta: {prop: 'value'},
|
|
101
108
|
handler(ctx) {
|
|
102
109
|
// GET /users/10?include=city
|
|
103
110
|
// Cookie: foo=bar; baz=qux;
|
|
104
|
-
console.log(ctx.
|
|
105
|
-
console.log(ctx.
|
|
106
|
-
console.log(ctx.
|
|
107
|
-
console.log(ctx.
|
|
108
|
-
console.log(ctx.
|
|
109
|
-
console.log(ctx.
|
|
110
|
-
console.log(ctx.
|
|
111
|
-
|
|
112
|
-
console.log(ctx.
|
|
113
|
-
console.log(ctx.
|
|
114
|
-
console.log(ctx.
|
|
111
|
+
console.log(ctx.params); // {id: 10}
|
|
112
|
+
console.log(ctx.query); // {include: 'city'}
|
|
113
|
+
console.log(ctx.headers); // {cookie: 'foo=bar; baz=qux;'}
|
|
114
|
+
console.log(ctx.cookies); // {foo: 'bar', baz: 'qux'}
|
|
115
|
+
console.log(ctx.method); // "GET"
|
|
116
|
+
console.log(ctx.path); // "/users/10?include=city"
|
|
117
|
+
console.log(ctx.pathname); // "/users/10"
|
|
118
|
+
// дополнительные свойства
|
|
119
|
+
console.log(ctx.container); // ServiceContainer
|
|
120
|
+
console.log(ctx.request); // IncomingMessage
|
|
121
|
+
console.log(ctx.response); // ServerResponse
|
|
122
|
+
console.log(ctx.route); // Route
|
|
123
|
+
console.log(ctx.meta); // {prop: 'value'}
|
|
115
124
|
// ...
|
|
116
125
|
},
|
|
117
126
|
});
|
|
@@ -150,10 +159,13 @@ router.defineRoute({ // регистрация маршрута
|
|
|
150
159
|
```js
|
|
151
160
|
router.defineRoute({
|
|
152
161
|
// ...
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
162
|
+
// для доступа к свойству `response` (ServerResponse)
|
|
163
|
+
// используется деструктуризация контекста запроса,
|
|
164
|
+
// что аналогично записи handler(ctx) { ctx.response ...
|
|
165
|
+
handler({response}) {
|
|
166
|
+
response.statusCode = 404;
|
|
167
|
+
response.setHeader('content-type', 'text/plain; charset=utf-8');
|
|
168
|
+
response.end('404 Not Found', 'utf-8');
|
|
157
169
|
},
|
|
158
170
|
});
|
|
159
171
|
```
|
|
@@ -257,12 +269,13 @@ router.addPostHandler((ctx, data) => {
|
|
|
257
269
|
быть схемы для валидации данных, правила доступа или настройки кэширования.
|
|
258
270
|
Для этой цели определение маршрута поддерживает необязательное свойство `meta`.
|
|
259
271
|
|
|
260
|
-
Маршрутизатор
|
|
261
|
-
|
|
272
|
+
Маршрутизатор передает в контекст запроса найденный маршрут. Контекст,
|
|
273
|
+
в свою очередь, предоставляет доступ к мета-данным этого маршрута через
|
|
274
|
+
свойство `meta`, откуда их могут прочитать обработчики или хуки.
|
|
262
275
|
|
|
263
276
|
```js
|
|
264
277
|
import http from 'http';
|
|
265
|
-
import {TrieRouter} from '@e22m4u/js-trie-router';
|
|
278
|
+
import {TrieRouter, HttpMethod} from '@e22m4u/js-trie-router';
|
|
266
279
|
|
|
267
280
|
const server = new http.Server();
|
|
268
281
|
const router = new TrieRouter();
|
|
@@ -275,7 +288,7 @@ router.addPreHandler((ctx) => {
|
|
|
275
288
|
});
|
|
276
289
|
|
|
277
290
|
router.defineRoute({
|
|
278
|
-
method:
|
|
291
|
+
method: HttpMethod.GET,
|
|
279
292
|
path: '/',
|
|
280
293
|
meta: {foo: 'bar'}, // <= мета-данные
|
|
281
294
|
handler(ctx) {
|