Skip to content

Commit

Permalink
Compose error middleware together
Browse files Browse the repository at this point in the history
  • Loading branch information
blakeembrey committed Jun 28, 2016
1 parent 2449a85 commit 1ff2987
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 16 deletions.
2 changes: 2 additions & 0 deletions README.md
Expand Up @@ -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
Expand Down
46 changes: 30 additions & 16 deletions 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<Middleware>
export type Handler = Middleware | flatten.NestedArray<Middleware>

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<Middleware>(handlers)

for (const handler of stack) {
Expand All @@ -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 {
Expand All @@ -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)
}
}

0 comments on commit 1ff2987

Please sign in to comment.