4.0.0 • Published 2 years ago

@keleran/routing v4.0.0

Weekly downloads
3
License
MIT
Repository
github
Last release
2 years ago

@keleran/routing

Utilities to simplify request routing in Node.js projects.
Use ESM, require Node.js 16+.

GitHub Workflow Status

Installation

$ npm i @keleran/routing
import {discover, mount} from '@keleran/routing';

discover

Returns a flat list of route handlers found in the specified directory. If you don't need to work with the list before mounting, use mount directly - it returns the same data.

// [{route: String, method: String, source: Object, pipeline: Array}, ...]
const handlers = await discover({dir: 'routes'});

mount

Reads a file tree and mounts request handlers to the specified Express app.

Request handler is a file named as "HTTP_METHOD.js" (get.js, post.js, etc.) that exports an object with the following properties:

  1. "rateLimit" (optional) - a string or an object that defines rate limiting options for the rate-limiter-flexible library.
    The string is parsed with the ms library, "1s" means "allow 1 request per second from this IP".
    The object is passed to rate-limiter-flexible as is. HTTP 429 will be thrown upon exceeding the limit.
  2. "authorize" (optional) - an authorization function that MUST return true for request to be processed. Otherwise it throws HTTP 403 using the http-errors library. Supplied with the "req" and "res" arguments. Can be async.
  3. "middleware" (optional) - a function or an array of functions that are regular middleware with the "req", "res", and "next" arguments supplied.
  4. "handle" - the main function that handles the request. Supplied with the "req" and "res" arguments. Can be async.

The order of execution matches the order listed above.

Example

The following tree:

routes
├── =
│   └── get.js
└── route
    ├── get.js
    └── =param-name
        └── get.js

With the call:

await mount({dir: 'routes', app, route: '/test'});

Will be mounted like this (notice the order and param/wildcard substitution):

app.get('/test/route', /* handler defined in routes/route/get.js */);
app.get('/test/route/:paramName', /* handler defined in routes/route/=param-name/get.js */);
app.get('/test/*', /* handler defined in routes/=/get.js */);
4.0.0

2 years ago

3.0.0

2 years ago

3.0.0-beta

3 years ago

2.1.2

3 years ago

2.1.1

4 years ago

2.1.0

4 years ago

2.0.4

4 years ago

2.0.3

5 years ago

2.0.2

5 years ago

2.0.1

5 years ago

2.0.0

5 years ago

1.3.3

5 years ago

1.3.2

5 years ago

1.3.1

6 years ago

1.2.1

6 years ago

1.1.1

6 years ago

1.1.0

6 years ago

1.0.0

6 years ago