strongloop/loopback — pull request #767 by bajtos (2014-11-07 14:36:35+00:00)
Title: Middleware phases - initial implementation

Modify the app and router implementation, so that the middleware is
executed in order defined by phases.

Predefined phases: 'init', 'routes', 'files', 'final'

Methods defined via `app.use`, `app.route` and friends are executed
as the first thing in 'routes' phase.

API usage:

app.middleware('init', compression());
app.middleware('before:init', serveFavicon());
app.middleware('after:files', loopback.urlNotFound());
app.middleware('after:final', errorHandler());

Middleware flavours:

// regular handler
function handler(req, res, next) {
// do stuff
next();
}

// error handler
function errorHandler(err, req, res, next) {
// handle error and/or call next
next(err);
}

See also:
- The discussion in #757, especially my last comment
- #739 (the work item)

**Out of scope - will be done later**

- More predefined phases
- API for adding custom phases
- Draft of Confluence docs

/to @ritch @raymondfeng please review
/cc @fabien @superkhau