HTTP маршрутизатор для Node.js на основе префиксного дерева
|
|
1 year ago | |
|---|---|---|
| .husky | 1 year ago | |
| examples | 1 year ago | |
| src | 1 year ago | |
| .c8rc | 1 year ago | |
| .commitlintrc | 1 year ago | |
| .editorconfig | 1 year ago | |
| .gitignore | 1 year ago | |
| .mocharc.cjs | 1 year ago | |
| .prettierrc | 1 year ago | |
| LICENSE | 1 year ago | |
| README.md | 1 year ago | |
| eslint.config.js | 1 year ago | |
| package.json | 1 year ago | |
| tsconfig.json | 1 year ago |
A pure ES-module of the Node.js HTTP router that uses the Trie for routing.
cookie header.preHandler and postHandler
hooks.npm install @e22m4u/js-trie-router
To load an ES-module set "type": "module" in the
package.json or use the .mjs extension.
A basic "Hello world." example.
import http from 'http';
import {TrieRouter} from '../src/index.js';
import {HTTP_METHOD} from '../src/route.js';
const server = new http.Server(); // A Node.js HTTP server.
const router = new TrieRouter(); // A TrieRouter instance.
router.defineRoute({
method: HTTP_METHOD.GET, // Request method.
path: '/', // Path template like "/user/:id".
handler(ctx) { // Request handler.
return 'Hello world!';
},
});
server.on('request', router.requestHandler);
server.listen(3000, 'localhost');
// Open in browser http://localhost:3000
The first parameter of a route handler is a
RequestContext instance.
container: ServiceContainer is an instance of the ServiceContainerreq: IncomingMessage is a native request from the
http moduleres: ServerResponse is a native response from the
http moduleparams: ParsedParams is a key-value object of path
parametersquery: ParsedQuery is a key-value object of a parsed
query stringheaders: ParsedHeaders is a key-value object of request
headerscookie: ParsedCookie is a key-value object of a parsed
cookie headermethod: string is a request method in lower case like
get, post etc.path: string is a request pathname with a query
stringpathname: string is a request pathname without a query
stringHere are example values of RequestContext properties.
router.defineRoute({
method: 'get',
path: '/users/:id',
handler(ctx) {
// GET /users/10?include=city
// Cookie: foo=bar; baz=qux;
console.log(ctx.req); // IncomingMessage
console.log(ctx.res); // ServerResponse
console.log(ctx.params); // {id: 10}
console.log(ctx.query); // {include: 'city'}
console.log(ctx.headers); // {cookie: 'foo=bar; baz=qux;'}
console.log(ctx.cookie); // {foo: 'bar', baz: 'qux'}
console.log(ctx.method); // "get"
console.log(ctx.path); // "/users/10?include=city"
console.log(ctx.pathname); // "/users/10"
// ...
},
});
Return values of a route handler will be sent as described below.
| value | content-type |
|---|---|
string |
text/plain |
number |
application/json |
boolean |
application/json |
object |
application/json |
Buffer |
application/octet-stream |
Stream |
application/octet-stream |
Here is an example of a JSON response.
router.defineRoute({
// ...
handler(ctx) {
// sends "application/json"
return {foo: 'bar'};
},
});
If the ServerResponse has been sent manually, then a
return value of the route handler will be ignored.
router.defineRoute({
// ...
handler(ctx) {
res.statusCode = 404;
res.setHeader('content-type', 'text/plain; charset=utf-8');
res.end('404 Not Found', 'utf-8');
},
});
A route definition allows you to set following hooks:
preHandler is executed before a route handler.postHandler is executed after a route handler.If the preHandler hook returns a value other than
undefined or null, it will be used as the
server response.
router.defineRoute({
// ...
preHandler(ctx) {
return 'Are you authenticated?';
},
handler(ctx) {
// the request handler will be skipped because
// the "preHandler" hook returns a non-empty value
return 'Hello world!';
},
});
A return value of the route handler will be passed as the second
argument to the preHandler hook.
router.defineRoute({
// ...
handler(ctx) {
return 'Hello world!';
},
preHandler(ctx, data) {
// after the route handler
return data.toUpperCase(); // HELLO WORLD!
},
});
A Router instance allows you to set following global
hooks:
preHandler is executed before each route handler.postHandler is executed after each route handler.The addHook method of a Router instance
accepts a hook name as the first parameter and a hook function as the
second.
router.addHook('preHandler', (ctx) => {
// executes before each route handler
});
router.addHook('postHandler', (ctx, data) => {
// executes after each route handler
});
Similar to a route hook, if a global hook returns a value other than
undefined or null, that value will be used as
the server response.
Set environment variable DEBUG=jsTrieRouter* before
start.
DEBUG=jsPathTrie* npm run test
npm run test
MIT