Benefits:
- Reverse routing (with query support)
- Enforcement of utilizing Controllers
- Global middleware per Controller
- Seperate method from middleware for testability
- Probably other things.. but those are the most important.
| var app = express(); | |
| // Initialize router | |
| var router = require('./router')(app); | |
| // Import routes (relative to router location) | |
| // | |
| // ./router.js -> ./:filename | |
| // | |
| // 'site' -> expands to -> ./site.js | |
| router.import([ | |
| 'site' | |
| ]); |
| var querystring = require('querystring'); | |
| var reverse = require('reverse-path'); | |
| var lodash = require('lodash'); | |
| module.exports = function (app) { | |
| app.locals.reverse = function (name, options, query) { | |
| var path = app.routes[name]; | |
| return path ? reverse(path, options) + (query ? querystring.stringify(query) : '') : ''; | |
| }; | |
| app.use(function (req, res, next) { | |
| res.reverse = app.locals.reverse; | |
| next(); | |
| }); | |
| return { | |
| import: function importRoutes (files) { | |
| app.routes = {}; | |
| lodash.each(files, function (filename) { | |
| var router = require('./' + filename); | |
| var middleware = router.middleware; | |
| var routes; | |
| delete router.middleware; | |
| routes = Object.keys(router); | |
| lodash.forEach(routes, function (name) { | |
| var route = router[name]; | |
| // Setup middleware array | |
| route.middleware = route.middleware || []; | |
| // Concat global middleware | |
| if (middleware) { | |
| route.middleware = middleware.concat(route.middleware); | |
| } | |
| // Setup route | |
| global.log.debug('Setting up route', route.method, route.name, route.path); | |
| app[route.method](route.path, route.middleware, route.controller); | |
| app.routes[route.name] = route.path; | |
| }); | |
| }); | |
| } | |
| }; | |
| }; |
| var csurf = require('csurf'); | |
| /** | |
| * Controller Middleware | |
| * | |
| * Applies to all routes in this controller. | |
| * | |
| * @type {Array} | |
| */ | |
| exports.middleware = [ | |
| csurf() | |
| ]; | |
| /** | |
| * Site index view | |
| * | |
| * @type {Object} | |
| */ | |
| exports.index = { | |
| method: 'get', | |
| name: 'index', | |
| path: '/', | |
| controller: function (req, res) { | |
| res.redirect(req.user ? | |
| res.reverse('dashboard') : | |
| res.reverse('login')); | |
| } | |
| }; | |
| /** | |
| * Dashboard view | |
| * | |
| * @type {Object} | |
| */ | |
| exports.dashboard = { | |
| method: 'get', | |
| name: 'dashboard', | |
| path: '/dashboard', | |
| // Authentication middleware, or route specific middleware | |
| // middleware: [isAuthorized], | |
| controller: function (req, res) { | |
| res.render('dashboard', { | |
| user: req.user | |
| }) | |
| } | |
| }; |