@e22m4u/js-trie-router
Advanced tools
Comparing version 0.0.3 to 0.0.4
{ | ||
"name": "@e22m4u/js-trie-router", | ||
"version": "0.0.3", | ||
"description": "Trie-роутер для Node.js", | ||
"version": "0.0.4", | ||
"description": "HTTP router for Node.js based on a prefix tree", | ||
"type": "module", | ||
@@ -29,30 +29,29 @@ "main": "src/index.js", | ||
"homepage": "https://github.com/e22m4u/js-trie-router", | ||
"dependencies": { | ||
"@e22m4u/js-format": "~0.1.0", | ||
"@e22m4u/js-path-trie": "~0.0.2", | ||
"@e22m4u/js-service": "~0.1.0", | ||
"debug": "~4.3.7", | ||
"http-errors": "~2.0.0", | ||
"statuses": "~2.0.1" | ||
}, | ||
"devDependencies": { | ||
"@commitlint/cli": "~19.4.0", | ||
"@commitlint/config-conventional": "~19.2.2", | ||
"@eslint/js": "~9.9.0", | ||
"@types/chai-as-promised": "^8.0.0", | ||
"@commitlint/cli": "~19.5.0", | ||
"@commitlint/config-conventional": "~19.5.0", | ||
"@eslint/js": "~9.12.0", | ||
"@types/chai-as-promised": "~8.0.1", | ||
"c8": "~10.1.2", | ||
"chai": "~5.1.1", | ||
"chai-as-promised": "^8.0.0", | ||
"eslint": "~9.9.0", | ||
"chai-as-promised": "~8.0.0", | ||
"eslint": "~9.12.0", | ||
"eslint-config-prettier": "~9.1.0", | ||
"eslint-plugin-chai-expect": "~3.1.0", | ||
"eslint-plugin-jsdoc": "^50.2.2", | ||
"eslint-plugin-jsdoc": "~50.3.1", | ||
"eslint-plugin-mocha": "~10.5.0", | ||
"globals": "~15.9.0", | ||
"husky": "~9.1.4", | ||
"globals": "~15.10.0", | ||
"husky": "~9.1.6", | ||
"mocha": "~10.7.3", | ||
"prettier": "~3.3.3", | ||
"typescript": "~5.5.4" | ||
}, | ||
"dependencies": { | ||
"@e22m4u/js-format": "^0.1.0", | ||
"@e22m4u/js-path-trie": "^0.0.1", | ||
"@e22m4u/js-service": "^0.0.12", | ||
"debug": "^4.3.6", | ||
"http-errors": "^2.0.0", | ||
"path-to-regexp": "^7.1.0", | ||
"statuses": "^2.0.1" | ||
"typescript": "~5.6.2" | ||
} | ||
} |
189
README.md
## @e22m4u/js-trie-router | ||
ES-модуль HTTP роутера для Node.js, использующий | ||
[Trie](https://en.wikipedia.org/wiki/Trie) | ||
для разрешения маршрутов. | ||
*English | [Русский](./README-ru.md)* | ||
- Поддержка [path-to-regexp](https://github.com/pillarjs/path-to-regexp) синтаксиса. | ||
- Автоматический парсинг JSON-тела запроса. | ||
- Парсинг строки запроса и заголовка `cookie`. | ||
- Поддержка `preHandler` и `postHandler` хуков. | ||
- Позволяет использовать асинхронные обработчики. | ||
HTTP router for Node.js based on | ||
a [prefix tree](https://en.wikipedia.org/wiki/Trie) (trie). | ||
## Установка | ||
- Supports [path-to-regexp](https://github.com/pillarjs/path-to-regexp) syntax. | ||
- Parses JSON request body automatically. | ||
- Parses query string and `cookie` header. | ||
- Supports `preHandler` and `postHandler` hooks. | ||
- Supports asynchronous handlers. | ||
## Installation | ||
```bash | ||
@@ -19,21 +20,21 @@ npm install @e22m4u/js-trie-router | ||
Для загрузки ES-модуля требуется установить `"type": "module"` в файле | ||
`package.json`, или использовать `.mjs` расширение. | ||
To load the ES-module, you need to set `"type": "module"` | ||
in the `package.json` file, or use the `.mjs` extension. | ||
## Обзор | ||
## Overview | ||
Базовый пример создания экземпляра роутера, объявления маршрута | ||
и передачи слушателя запросов `http` серверу. | ||
A basic example of creating a router instance, defining | ||
a route and startup Node.js HTTP server. | ||
```js | ||
import http from 'http'; | ||
import {TrieRouter} from '@e22m4u/js-path-trie'; | ||
import {TrieRouter} from '@e22m4u/js-trie-router'; | ||
const server = new http.Server(); // создание экземпляра HTTP сервера | ||
const router = new TrieRouter(); // создание экземпляра роутера | ||
const server = new http.Server(); // Node.js HTTP server | ||
const router = new TrieRouter(); // TrieRouter instance | ||
router.defineRoute({ | ||
method: 'GET', // метод запроса "GET", "POST" и т.д. | ||
path: '/', // шаблон пути, пример "/user/:id" | ||
handler(ctx) { // обработчик маршрута | ||
router.defineRoute({ // route definition | ||
method: 'GET', // request method "GET", "POST", etc. | ||
path: '/', // path template, example "/user/:id" | ||
handler(ctx) { // route handler | ||
return 'Hello world!'; | ||
@@ -43,4 +44,4 @@ }, | ||
server.on('request', router.requestListener); // подключение роутера | ||
server.listen(3000, 'localhost'); // прослушивание запросов | ||
server.on('request', router.requestListener); // inject request listener | ||
server.listen(3000, 'localhost'); // listen for requests | ||
@@ -50,20 +51,20 @@ // Open in browser http://localhost:3000 | ||
### Контекст запроса | ||
### Request context | ||
Первый параметр обработчика маршрута принимает экземпляр класса | ||
`RequestContext` с набором свойств, содержащих разобранные | ||
данные входящего запроса. | ||
The first parameter of a route handler is an instance | ||
of the `RequestContext` class which has a properties | ||
set with contents of a parsed incoming request. | ||
- `container: ServiceContainer` экземпляр [сервис-контейнера](https://npmjs.com/package/@e22m4u/js-service) | ||
- `req: IncomingMessage` нативный поток запроса модуля `http` | ||
- `res: ServerResponse` нативный поток ответа модуля `http` | ||
- `params: ParsedParams` объект ключ-значение с параметрами пути | ||
- `query: ParsedQuery` объект ключ-значение с параметрами строки запроса | ||
- `headers: ParsedHeaders` объект ключ-значение с заголовками запроса | ||
- `cookie: ParsedCookie` объект ключ-значение разобранного заголовка `cookie` | ||
- `method: string` метод запроса в верхнем регистре, например `GET`, `POST` и т.д. | ||
- `path: string` путь включающий строку запроса, например `/myPath?foo=bar` | ||
- `pathname: string` путь запроса, например `/myMath` | ||
- `container: ServiceContainer` instance of [service container](https://npmjs.com/package/@e22m4u/js-service) | ||
- `req: IncomingMessage` native incoming request stream | ||
- `res: ServerResponse` native server response stream | ||
- `params: ParsedParams` key-value object with path parameters | ||
- `query: ParsedQuery` key-value object with query string parameters | ||
- `headers: ParsedHeaders` key-value object with request headers | ||
- `cookie: ParsedCookie` key-value object of parsed `cookie` header | ||
- `method: string` request method in uppercase, e.g. `GET`, `POST`, etc. | ||
- `path: string` path including query string, e.g. `/myPath?foo=bar` | ||
- `pathname: string` request path, e.g. `/myMath` | ||
Пример доступа к контексту из обработчика маршрута. | ||
Example of accessing the context from a route handler. | ||
@@ -91,8 +92,8 @@ ```js | ||
### Отправка ответа | ||
### Response sending | ||
Возвращаемое значение обработчика маршрута используется в качестве ответа | ||
сервера. Тип значения влияет на представление возвращаемых данных. Например, | ||
если результатом будет являться тип `object`, то такое значение автоматически | ||
сериализуется в JSON. | ||
Return value of a route handler is used as response data. | ||
Value type affects representation of a response data. For example, | ||
if a response data is of type `object`, it will be automatically | ||
serialized to JSON. | ||
@@ -108,9 +109,9 @@ | value | content-type | | ||
Пример возвращаемого значения обработчиком маршрута. | ||
Example of sending data as JSON. | ||
```js | ||
router.defineRoute({ // регистрация маршрута | ||
router.defineRoute({ // register a route | ||
// ... | ||
handler(ctx) { // обработчик входящего запроса | ||
return {foo: 'bar'}; // ответ будет представлен в виде JSON | ||
handler(ctx) { // incoming request handler | ||
return {foo: 'bar'}; // response will be encoded to JSON | ||
}, | ||
@@ -120,4 +121,5 @@ }); | ||
Контекст запроса `ctx` содержит нативный экземпляр класса `ServerResponse`, | ||
который может быть использован для ручного управления ответом. | ||
The request context `ctx` contains a native instance | ||
of the `ServerResponse` class from the `http` module, | ||
which can be used for manual response management. | ||
@@ -135,24 +137,24 @@ ```js | ||
### Хуки маршрута | ||
### Route hooks | ||
Определение маршрута методом `defineRoute` позволяет задать хуки | ||
для отслеживания и перехвата входящего запроса и ответа | ||
конкретного маршрута. | ||
Defining a route with the `defineRoute` method allows | ||
to set up hooks to monitor and intercept requests and | ||
responses for a specific route. | ||
- `preHandler` выполняется перед вызовом обработчика | ||
- `postHandler` выполняется после вызова обработчика | ||
- `preHandler` executes before a route handler | ||
- `postHandler` executes after a route handler | ||
#### preHandler | ||
Перед вызовом обработчика маршрута может потребоваться выполнение | ||
таких операции как авторизация и проверка параметров запроса. Для | ||
этого можно использовать хук `preHandler`. | ||
Before calling a route handler, operations such as authorization | ||
and request validation may be performed in the `preHandler` | ||
hook. | ||
```js | ||
router.defineRoute({ // регистрация маршрута | ||
router.defineRoute({ // register a route | ||
// ... | ||
preHandler(ctx) { | ||
// вызывается перед обработчиком | ||
console.log(`Incoming request ${ctx.method} ${ctx.path}`); | ||
// Incoming request GET /myPath | ||
// before the route handler | ||
console.log(`incoming request ${ctx.method} ${ctx.path}`); | ||
// > incoming request GET /myPath | ||
}, | ||
@@ -165,16 +167,17 @@ handler(ctx) { | ||
Если хук `preHandler` возвращает значение отличное от `undefined` и `null`, | ||
то такое значение будет использовано в качестве ответа сервера, а вызов | ||
обработчика маршрута будет пропущен. | ||
A route handler will not be called if `preHandler` hook | ||
returns a value other than `undefined` and `null`, because | ||
that value will be sent as response data. | ||
```js | ||
router.defineRoute({ // регистрация маршрута | ||
router.defineRoute({ // register a route | ||
// ... | ||
preHandler(ctx) { | ||
// возвращение ответа сервера | ||
// return the response data | ||
return 'Are you authorized?'; | ||
}, | ||
handler(ctx) { | ||
// данный обработчик не вызывается, так как | ||
// хук "preHandler" уже отправил ответ | ||
// this handler will not be called | ||
// because the "preHandler" hook | ||
// has already sent the data | ||
}, | ||
@@ -186,7 +189,5 @@ }); | ||
Возвращаемое значение обработчика маршрута передается вторым аргументом | ||
хука `postHandler`. По аналогии с `preHandler`, если возвращаемое | ||
значение отличается от `undefined` и `null`, то такое значение будет | ||
использовано в качестве ответа сервера. Это может быть полезно для | ||
модификации возвращаемого ответа. | ||
Return value of a route handler is passed to the second | ||
parameter of `postHandler` hook. It may be useful to modify | ||
the value before being sent. | ||
@@ -197,6 +198,7 @@ ```js | ||
handler(ctx) { | ||
// return the response data | ||
return 'Hello world!'; | ||
}, | ||
postHandler(ctx, data) { | ||
// выполняется после обработчика маршрута | ||
// modify the response data before send | ||
return data.toUpperCase(); // HELLO WORLD! | ||
@@ -207,37 +209,38 @@ }, | ||
### Глобальные хуки | ||
### Global hooks | ||
Экземпляр роутера `TrieRouter` позволяет задать глобальные хуки, которые | ||
имеют более высокий приоритет перед хуками маршрута, и вызываются | ||
в первую очередь. | ||
A `TrieRouter` instance allows to set up global hooks | ||
that have higher priority over route hooks and are | ||
called first. | ||
- `preHandler` выполняется перед вызовом обработчика | ||
- `postHandler` выполняется после вызова обработчика | ||
- `preHandler` executes before each route handler | ||
- `postHandler` executes after each route handler | ||
Добавить глобальные хуки можно методом `addHook` экземпляра роутера, | ||
где первым параметром передается название хука, а вторым его функция. | ||
Global hooks can be added using the `addHook` method | ||
of a router instance, where the first parameter | ||
is the hook name and the second is a function. | ||
```js | ||
router.addHook('preHandler', (ctx) => { | ||
// вызов перед обработчиком маршрута | ||
// before a route handler | ||
}); | ||
router.addHook('postHandler', (ctx, data) => { | ||
// вызов после обработчика маршрута | ||
// after a route handler | ||
}); | ||
``` | ||
Аналогично хукам маршрута, если глобальный хук возвращает значение | ||
отличное от `undefined` и `null`, то такое значение будет использовано | ||
как ответ сервера. | ||
Similar to route hooks, if a global hook returns | ||
a value other than `undefined` and `null`, that | ||
value will be sent as response data. | ||
## Отладка | ||
## Debugging | ||
Установка переменной `DEBUG` перед командой запуска включает вывод логов. | ||
Set the `DEBUG` variable to enable log output. | ||
```bash | ||
DEBUG=jsPathTrie* npm run test | ||
DEBUG=jsTrieRouter* npm run test | ||
``` | ||
## Тестирование | ||
## Testing | ||
@@ -248,4 +251,4 @@ ```bash | ||
## Лицензия | ||
## License | ||
MIT |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
229246
6
113
243
+ Added@e22m4u/js-path-trie@0.0.9(transitive)
+ Added@e22m4u/js-service@0.1.11(transitive)
+ Addedpath-to-regexp@8.2.0(transitive)
- Removedpath-to-regexp@^7.1.0
- Removed@e22m4u/js-format@0.0.10(transitive)
- Removed@e22m4u/js-path-trie@0.0.1(transitive)
- Removed@e22m4u/js-service@0.0.12(transitive)
- Removedpath-to-regexp@7.1.07.2.0(transitive)
Updated@e22m4u/js-format@~0.1.0
Updated@e22m4u/js-path-trie@~0.0.2
Updated@e22m4u/js-service@~0.1.0
Updateddebug@~4.3.7
Updatedhttp-errors@~2.0.0
Updatedstatuses@~2.0.1