{"id":19988761,"url":"https://github.com/e22m4u/js-trie-router","last_synced_at":"2025-06-23T06:35:13.764Z","repository":{"id":255445831,"uuid":"852211351","full_name":"e22m4u/js-trie-router","owner":"e22m4u","description":"HTTP маршрутизатор для Node.js на основе префиксного дерева","archived":false,"fork":false,"pushed_at":"2025-06-01T09:22:31.000Z","size":157,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-01T17:54:55.407Z","etag":null,"topics":["esm","http","javascript","nodejs","prefix-tree","router","server","trie","typescript"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/e22m4u.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-09-04T12:23:43.000Z","updated_at":"2025-06-01T09:22:35.000Z","dependencies_parsed_at":null,"dependency_job_id":"5c3f11e8-506d-43fb-a09b-29dd43dd0fdf","html_url":"https://github.com/e22m4u/js-trie-router","commit_stats":null,"previous_names":["e22m4u/js-trie-router"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/e22m4u/js-trie-router","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/e22m4u%2Fjs-trie-router","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/e22m4u%2Fjs-trie-router/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/e22m4u%2Fjs-trie-router/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/e22m4u%2Fjs-trie-router/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/e22m4u","download_url":"https://codeload.github.com/e22m4u/js-trie-router/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/e22m4u%2Fjs-trie-router/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261430124,"owners_count":23157155,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["esm","http","javascript","nodejs","prefix-tree","router","server","trie","typescript"],"created_at":"2024-11-13T04:44:04.137Z","updated_at":"2025-06-23T06:35:08.753Z","avatar_url":"https://github.com/e22m4u.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## @e22m4u/js-trie-router\n\n*[English](./README.md) | Русский*\n\nHTTP роутер для Node.js на основе\n[префиксного дерева](https://ru.wikipedia.org/wiki/Trie) (trie).\n\n- Поддержка [path-to-regexp](https://github.com/pillarjs/path-to-regexp) синтаксиса.\n- Автоматический парсинг JSON-тела запроса.\n- Парсинг строки запроса и заголовка `cookie`.\n- Поддержка `preHandler` и `postHandler` хуков.\n- Позволяет использовать асинхронные обработчики.\n\n## Установка\n\nТребуется Node.js 16 и выше.\n\n```bash\nnpm install @e22m4u/js-trie-router\n```\n\nМодуль поддерживает ESM и CommonJS стандарты.\n\n*ESM*\n\n```js\nimport {TrieRouter} from '@e22m4u/js-trie-router';\n```\n\n*CommonJS*\n\n```js\nconst {TrieRouter} = require('@e22m4u/js-trie-router');\n```\n\n## Обзор\n\nБазовый пример создания экземпляра роутера, объявления маршрута\nи передачи слушателя запросов HTTP серверу.\n\n```js\nimport http from 'http';\nimport {TrieRouter} from '@e22m4u/js-trie-router';\n\nconst server = new http.Server(); // создание экземпляра HTTP сервера\nconst router = new TrieRouter();  // создание экземпляра роутера\n\nrouter.defineRoute({\n  method: 'GET',                  // метод запроса \"GET\", \"POST\" и т.д.\n  path: '/',                      // шаблон пути, пример \"/user/:id\"\n  handler(ctx) {                  // обработчик маршрута\n    return 'Hello world!';\n  },\n});\n\nserver.on('request', router.requestListener); // подключение роутера\nserver.listen(3000, 'localhost');             // прослушивание запросов\n\n// Open in browser http://localhost:3000\n```\n\n### Контекст запроса\n\nПервый параметр обработчика маршрута принимает экземпляр класса\n`RequestContext` с набором свойств, содержащих разобранные\nданные входящего запроса.\n\n- `container: ServiceContainer` экземпляр [сервис-контейнера](https://npmjs.com/package/@e22m4u/js-service)\n- `req: IncomingMessage` нативный поток входящего запроса\n- `res: ServerResponse` нативный поток ответа сервера\n- `params: ParsedParams` объект ключ-значение с параметрами пути\n- `query: ParsedQuery` объект ключ-значение с параметрами строки запроса\n- `headers: ParsedHeaders` объект ключ-значение с заголовками запроса \n- `cookie: ParsedCookie` объект ключ-значение разобранного заголовка `cookie`\n- `method: string` метод запроса в верхнем регистре, например `GET`, `POST` и т.д.\n- `path: string` путь включающий строку запроса, например `/myPath?foo=bar`\n- `pathname: string` путь запроса, например `/myMath`\n- `body: unknown` тело запроса\n\nПример доступа к контексту из обработчика маршрута.\n\n```js\nrouter.defineRoute({\n  method: 'GET',\n  path: '/users/:id',\n  handler(ctx) {\n    // GET /users/10?include=city\n    // Cookie: foo=bar; baz=qux;\n    console.log(ctx.req);      // IncomingMessage\n    console.log(ctx.res);      // ServerResponse\n    console.log(ctx.params);   // {id: 10}\n    console.log(ctx.query);    // {include: 'city'}\n    console.log(ctx.headers);  // {cookie: 'foo=bar; baz=qux;'}\n    console.log(ctx.cookie);   // {foo: 'bar', baz: 'qux'}\n    console.log(ctx.method);   // \"GET\"\n    console.log(ctx.path);     // \"/users/10?include=city\"\n    console.log(ctx.pathname); // \"/users/10\"\n    // ...\n  },\n});\n```\n\n### Отправка ответа\n\nВозвращаемое значение обработчика маршрута используется в качестве ответа\nсервера. Тип значения влияет на представление возвращаемых данных. Например,\nесли результатом будет являться тип `object`, то такое значение автоматически\nсериализуется в JSON.\n\n| value     | content-type             |\n|-----------|--------------------------|\n| `string`  | text/plain               |\n| `number`  | application/json         |\n| `boolean` | application/json         |\n| `object`  | application/json         |\n| `Buffer`  | application/octet-stream |\n| `Stream`  | application/octet-stream |\n\nПример возвращаемого значения обработчиком маршрута.\n\n```js\nrouter.defineRoute({     // регистрация маршрута\n  // ...\n  handler(ctx) {         // обработчик входящего запроса\n    return {foo: 'bar'}; // ответ будет представлен в виде JSON\n  },\n});\n```\n\nКонтекст запроса `ctx` содержит нативный экземпляр класса `ServerResponse`\nмодуля `http`, который может быть использован для ручного управления ответом.\n\n```js\nrouter.defineRoute({\n  // ...\n  handler(ctx) {\n    res.statusCode = 404;\n    res.setHeader('content-type', 'text/plain; charset=utf-8');\n    res.end('404 Not Found', 'utf-8');\n  },\n});\n```\n\n### Хуки маршрута\n\nОпределение маршрута методом `defineRoute` позволяет задать хуки\nдля отслеживания и перехвата входящего запроса и ответа\nконкретного маршрута.\n\n- `preHandler` выполняется перед вызовом обработчика\n- `postHandler` выполняется после вызова обработчика\n\n#### preHandler\n\nПеред вызовом обработчика маршрута может потребоваться выполнение\nтаких операции как авторизация и проверка параметров запроса. Для\nэтого можно использовать хук `preHandler`.\n\n```js\nrouter.defineRoute({ // регистрация маршрута\n  // ...\n  preHandler(ctx) {\n    // перед обработчиком маршрута\n    console.log(`Incoming request ${ctx.method} ${ctx.path}`);\n    // \u003e incoming request GET /myPath\n  },\n  handler(ctx) {\n    return 'Hello world!';\n  },\n});\n```\n\nЕсли хук `preHandler` возвращает значение отличное от `undefined` и `null`,\nто такое значение будет использовано в качестве ответа сервера, а вызов\nобработчика маршрута будет пропущен.\n\n```js\nrouter.defineRoute({ // регистрация маршрута\n  // ...\n  preHandler(ctx) {\n    // возвращение ответа сервера\n    return 'Are you authorized?';\n  },\n  handler(ctx) {\n    // данный обработчик не будет вызван, так как\n    // хук \"preHandler\" уже отправил ответ\n  },\n});\n```\n\n#### postHandler\n\nВозвращаемое значение обработчика маршрута передается вторым аргументом\nхука `postHandler`. По аналогии с `preHandler`, если возвращаемое\nзначение отличается от `undefined` и `null`, то такое значение будет\nиспользовано в качестве ответа сервера. Это может быть полезно для\nмодификации возвращаемого ответа.\n\n```js\nrouter.defineRoute({\n  // ...\n  handler(ctx) {\n    return 'Hello world!';\n  },\n  postHandler(ctx, data) {\n    // после обработчика маршрута\n    return data.toUpperCase(); // HELLO WORLD!\n  },\n});\n```\n\n### Глобальные хуки\n\nЭкземпляр роутера `TrieRouter` позволяет задать глобальные хуки, которые\nимеют более высокий приоритет перед хуками маршрута, и вызываются\nв первую очередь.\n\n- `preHandler` выполняется перед вызовом обработчика каждого маршрута\n- `postHandler` выполняется после вызова обработчика каждого маршрута\n\nДобавить глобальные хуки можно методом `addHook` экземпляра роутера,\nгде первым параметром передается название хука, а вторым его функция.\n\n```js\nrouter.addHook('preHandler', (ctx) =\u003e {\n  // перед обработчиком маршрута\n});\n\nrouter.addHook('postHandler', (ctx, data) =\u003e {\n  // после обработчика маршрута\n});\n```\n\nАналогично хукам маршрута, если глобальный хук возвращает значение\nотличное от `undefined` и `null`, то такое значение будет использовано\nкак ответ сервера.\n\n## Отладка\n\nУстановка переменной `DEBUG` включает вывод логов.\n\n```bash\nDEBUG=jsTrieRouter* npm run test\n```\n\n## Тестирование\n\n```bash\nnpm run test\n```\n\n## Лицензия\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fe22m4u%2Fjs-trie-router","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fe22m4u%2Fjs-trie-router","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fe22m4u%2Fjs-trie-router/lists"}