diff --git a/README.md b/README.md index db16f39..196969c 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,8 @@ app.use(compose([ ])) ``` +**P.S.** The composed function takes three arguments. Express.js (and Connect, router) only accept error handlers of four arguments. If you want to return an error handler from `compose` instead, try the `errors` export - it works exactly the same, but exposes the four argument middleware pattern. + ## License MIT diff --git a/src/index.ts b/src/index.ts index 25584fe..0681981 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,13 +1,27 @@ import flatten = require('array-flatten') export type Callback = (err?: Error) => any -export type RequestMiddleware = (req?: any, res?: any, next?: Callback) => any -export type ErrorMiddleware = (err?: Error, req?: any, res?: any, next?: Callback) => any -export type Middleware = RequestMiddleware | ErrorMiddleware +export type RequestHandler = (req?: any, res?: any, next?: Callback) => any +export type ErrorHandler = (err?: Error, req?: any, res?: any, next?: Callback) => any +export type Middleware = RequestHandler | ErrorHandler -export type MiddlewareHandlers = Middleware | flatten.NestedArray +export type Handler = Middleware | flatten.NestedArray -export function compose (...handlers: MiddlewareHandlers[]): RequestMiddleware { +/** + * Compose an array of middleware handlers into a single handler. + */ +export function compose (...handlers: Handler[]): RequestHandler { + const middleware = errors(...handlers) + + return function (req: any, res: any, done: Callback) { + return middleware(null, req, res, done) + } +} + +/** + * Wrap middleware handlers. + */ +export function errors (...handlers: Handler[]): ErrorHandler { const stack = flatten(handlers) for (const handler of stack) { @@ -16,7 +30,7 @@ export function compose (...handlers: MiddlewareHandlers[]): RequestMiddleware { } } - return function middleware (req: any, res: any, done: Callback) { + return function middleware (err: any, req: any, res: any, done: Callback) { let index = 0 function next (err?: Error): void { @@ -28,19 +42,19 @@ export function compose (...handlers: MiddlewareHandlers[]): RequestMiddleware { if (handler.length === 4) { if (err) { - (handler as ErrorMiddleware)(err, req, res, next) - } else { - next(err) - } - } else { - if (err) { - next(err) - } else { - (handler as RequestMiddleware)(req, res, next) + return (handler as ErrorHandler)(err, req, res, next) } + + return next(err) } + + if (err) { + return next(err) + } + + return (handler as RequestHandler)(req, res, next) } - next() + return next(err) } }