From 93d45905280a297758d6e937c85f83e031928f03 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Fri, 18 Mar 2022 19:37:43 +0100 Subject: [PATCH] Global middleware --- README.md | 19 ++++++++++++++++++- index.d.ts | 16 +++++++++++++++- index.js | 20 ++++++++++++++++++-- 3 files changed, 51 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 605b9fc..e89d4bd 100644 --- a/README.md +++ b/README.md @@ -27,9 +27,17 @@ const router = new Router() // Enabling buildin CORS support router.cors() +// Register global middleware +router.use((req, res, next) => { + res.headers = { + ...res.headers, + 'X-Global-Middlewares': 'true' + } + next() +}) + // Simple get router.get('/user', (req, res) => { - res.body = { data: { id: 1, @@ -89,6 +97,15 @@ Enable or disable debug mode. Which will return the `error.stack` in case of an State is a `boolean` which determines if debug mode should be enabled or not (default: `true`) +### `router.use(handler) + +Register a global middleware handler. + +#### `handler` (function) + +Handler is a `function` which will be called for every request. + + ### `router.cors([config])` If enabled will overwrite other `OPTIONS` requests. diff --git a/index.d.ts b/index.d.ts index 916ee3c..d4a04c1 100644 --- a/index.d.ts +++ b/index.d.ts @@ -14,6 +14,13 @@ declare class Router { * @type {Route[]} */ protected routes: Route[] + /** + * Global Handlers + * + * @protected + * @type {Handler[]} + */ + protected globalHandlers: Handler[] /** * Debug Mode * @@ -70,6 +77,13 @@ declare class Router { * @param {Response} response * @param {next} next */ + /** + * Register global handler + * + * @param {RouterHandler} handler + * @param handlers + */ + use(handler: RouterHandler): Router /** * Register CONNECT route * @@ -303,7 +317,7 @@ type RouterResponse = { /** * Object you can set response headers in */ - headers: Headers + headers: Object /** * Return status code (default: `204`) */ diff --git a/index.js b/index.js index d82ec81..6bc147e 100644 --- a/index.js +++ b/index.js @@ -16,6 +16,11 @@ class Router { */ this.routes = [] + /** + * Global Handlers + */ + this.globalHandlers = [] + /** * Debug Mode * @@ -80,6 +85,16 @@ class Router { * @param {RouterNext} next */ + /** + * Register global handler + * + * @param {RouterHandler} handler + */ + use(handlers) { + this.globalHandlers.push(handlers) + return this + } + /** * Register CONNECT route * @@ -355,13 +370,14 @@ class Router { 'Access-Control-Max-Age': this.corsConfig.maxAge, } } + const handlers = [...this.globalHandlers, ...route.handlers] let prevIndex = -1 const runner = async index => { if (index === prevIndex) throw new Error('next() called multiple times') prevIndex = index - if (typeof route.handlers[index] === 'function') - await route.handlers[index](req, res, async () => await runner(index + 1)) + if (typeof handlers[index] === 'function') + await handlers[index](req, res, async () => await runner(index + 1)) } await runner(0) if (typeof res.body === 'object') {