Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@e22m4u/js-trie-router

Package Overview
Dependencies
Maintainers
1
Versions
17
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@e22m4u/js-trie-router - npm Package Compare versions

Comparing version 0.0.3 to 0.0.4

README-ru.md

41

package.json
{
"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"
}
}
## @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
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc