diff --git a/packages/server/src/router/AsyncRouter.test.ts b/packages/server/src/router/AsyncRouter.test.ts index 25fa897..a069eb3 100644 --- a/packages/server/src/router/AsyncRouter.test.ts +++ b/packages/server/src/router/AsyncRouter.test.ts @@ -27,6 +27,11 @@ describe('AsyncRouter', () => { patch: IHandler head: {}, } + '/middleware': { + get: { + response: IResponse + } + } } const app = express() @@ -55,6 +60,16 @@ describe('AsyncRouter', () => { asyncRouter.head('/test/:param', async req => { return '' }) + asyncRouter.get('/middleware', [(req, res, next) => { + (req as any).testParam = 'middle' + next() + }, (req, res, next) => { + (req as any).testParam += 'ware' + next() + }], async req => { + const value = (req as any).testParam as string + return {value} + }) it('creates its own router when not provided', () => { const r = new AsyncRouter() @@ -69,5 +84,7 @@ describe('AsyncRouter', () => { await request(app).options('/test/a').expect(200).expect('{"value":"a"}') await request(app).patch('/test/a').expect(500) await request(app).head('/test/a').expect(200) + await request(app).get('/middleware').expect(200) + .expect('{"value":"middleware"}') }) }) diff --git a/packages/server/src/router/AsyncRouter.ts b/packages/server/src/router/AsyncRouter.ts index 02cf092..e223e9f 100644 --- a/packages/server/src/router/AsyncRouter.ts +++ b/packages/server/src/router/AsyncRouter.ts @@ -1,6 +1,6 @@ import express from 'express' import {IRoutes, TMethod} from '@rondo/common' -import {TTypedHandler} from './TTypedHandler' +import {TTypedHandler, TTypedMiddleware} from './TTypedHandler' export class AsyncRouter { readonly router: express.Router @@ -14,11 +14,21 @@ export class AsyncRouter { protected addRoute( method: M, path: P, - handler: TTypedHandler, + ...handlers: [TTypedHandler] | [ + Array>, + TTypedHandler, + ] ) { const addRoute = this.router[method].bind(this.router as any) - addRoute(path, this.wrapHandler(handler)) + if (handlers.length === 2) { + const middleware = handlers[0] + const handler = handlers[1] + addRoute(path, ...middleware, this.wrapHandler(handler)) + } else { + addRoute(path, this.wrapHandler(handlers[0])) + } + } protected wrapHandler( @@ -35,44 +45,72 @@ export class AsyncRouter { get

( path: P, - handler: TTypedHandler, - ) { - this.addRoute('get', path, handler) + ...handlers: [TTypedHandler] | [ + Array>, + TTypedHandler, + ] + ): void { + this.addRoute('get', path, ...handlers) } post

( path: P, - handler: TTypedHandler, + ...handlers: [TTypedHandler] | [ + Array>, + TTypedHandler, + ] ) { - this.addRoute('post', path, handler) + this.addRoute('post', path, ...handlers) } put

( - path: P, handler: TTypedHandler, + path: P, + ...handlers: [TTypedHandler] | [ + Array>, + TTypedHandler, + ] ) { - this.addRoute('put', path, handler) + this.addRoute('put', path, ...handlers) } delete

( - path: P, handler: TTypedHandler) { - this.addRoute('delete', path, handler) + path: P, + ...handlers: [TTypedHandler] | [ + Array>, + TTypedHandler, + ] + ) { + this.addRoute('delete', path, ...handlers) } head

( path: P, - handler: TTypedHandler, + ...handlers: [TTypedHandler] | [ + Array>, + TTypedHandler, + ] ) { - this.addRoute('head', path, handler) + this.addRoute('head', path, ...handlers) } options

( - path: P, handler: TTypedHandler) { - this.addRoute('options', path, handler) + path: P, + ...handlers: [TTypedHandler] | [ + Array>, + TTypedHandler, + ] + ) { + this.addRoute('options', path, ...handlers) } patch

( - path: P, handler: TTypedHandler) { - this.addRoute('patch', path, handler) + path: P, + ...handlers: [TTypedHandler] | [ + Array>, + TTypedHandler, + ] + ) { + this.addRoute('patch', path, ...handlers) } } diff --git a/packages/server/src/router/TTypedHandler.ts b/packages/server/src/router/TTypedHandler.ts index 67402f6..9f5fe48 100644 --- a/packages/server/src/router/TTypedHandler.ts +++ b/packages/server/src/router/TTypedHandler.ts @@ -2,6 +2,16 @@ import express from 'express' import {IRoutes, TMethod} from '@rondo/common' import {ITypedRequest} from './ITypedRequest' +export type TTypedMiddleware< + R extends IRoutes, + P extends keyof R, + M extends TMethod +> = ( + req: ITypedRequest, + res: express.Response, + next: express.NextFunction, +) => void + export type TTypedHandler< R extends IRoutes, P extends keyof R,