diff --git a/package.json b/package.json index 43026aa..a1f395b 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,8 @@ "typescript": "^2.4.2" }, "dependencies": { - "array-flatten": "^2.1.0" + "@types/debug": "0.0.29", + "array-flatten": "^2.1.0", + "debug": "^2.6.8" } } diff --git a/src/index.ts b/src/index.ts index 02cc2f7..3c1948c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,8 @@ +import debug = require('debug') import flatten = require('array-flatten') +const log = debug('compose-middleware') + export type Callback = (err?: Error) => any export type RequestHandler = (req?: any, res?: any, next?: Callback) => any export type ErrorHandler = (err?: Error, req?: any, res?: any, next?: Callback) => any @@ -34,21 +37,19 @@ export function errors (...handlers: Handler[]): ErrorHandler { let index = -1 function dispatch (pos: number, err?: Error): void { - if (pos <= index) { - throw new TypeError('`next()` called multiple times') - } - index = pos if (index === stack.length) { return done(err) } - function next (err?: Error) { - return dispatch(pos + 1, err) - } + return handle(stack[pos], err, req, res, function next (err?: Error) { + if (pos < index) { + throw new TypeError('`next()` called multiple times') + } - return handle(stack[pos], err, req, res, next) + return dispatch(pos + 1, err) + }) } return dispatch(0, err) @@ -59,6 +60,8 @@ export function errors (...handlers: Handler[]): ErrorHandler { * Wrap middleware handling in a `try..catch` which forwards errors. */ function handle (handler: Middleware, err: Error, req: any, res: any, next: Callback) { + log('handle', (handler as any).name || '') + try { if (handler.length === 4) { if (err) { @@ -74,6 +77,8 @@ function handle (handler: Middleware, err: Error, req: any, res: any, next: Call return (handler as RequestHandler)(req, res, next) } catch (err) { + log('try..catch', err) + return next(err) } }