UNPKG

4.93 kBJavaScriptView Raw
1// Module dependencies
2var fs = require('fs'),
3 path = require('path'),
4 connect = require('connect'),
5 express = require('express'),
6 engines = require('consolidate'),
7 i18n = require('i18next'),
8 urljoin = require('./lib/urljoin'),
9 _ = require('lodash'),
10 logger = require('./lib/logger'),
11 settings = require('./config/settings');
12
13// Auto-load bundled middleware
14var middleware = {};
15
16fs.readdirSync(__dirname + '/lib/middleware').forEach(function(filename) {
17 if ( ! /\.js$/.test(filename)) {
18 return;
19 }
20 var name = path.basename(filename, '.js');
21 middleware[name] = require('./lib/middleware/' + name);
22});
23
24module.exports = function(options) {
25 options = options || {};
26
27 // Main app
28 var app = express();
29 var errorhandler = require('errorhandler');
30
31 // Setup logger (winston)
32 logger.init(settings.winston);
33 logger.registerAppHelper(app); // Register app.locals (app.helper)
34
35 var log = logger();
36
37 // Settings
38 (function(app) {
39 var env = process.env.NODE_ENV || 'development';
40 if ('development' === env) {
41 // Error handler - https://github.com/expressjs/errorhandler
42 // Development error handler, providing stack traces and error message responses
43 // for requests accepting text, html, or json.
44 app.use(errorhandler());
45
46 // a custom "verbose errors" setting which can be used in the templates via settings['verbose errors']
47 app.enable('verbose errors'); // Enables verbose errors in development
48 app.disable('view cache'); // Disables view template compilation caching in development
49 } else {
50 // a custom "verbose errors" setting which can be used in the templates via settings['verbose errors']
51 app.disable('verbose errors'); // Disables verbose errors in production
52 app.enable('view cache'); // Enables view template compilation caching in production
53 }
54
55 app.enable('trust proxy'); // Enables reverse proxy support, disabled by default
56 app.enable('case sensitive routing'); // Enable case sensitivity, disabled by default, treating "/Foo" and "/foo" as the same
57 app.disable('strict routing'); // Enable strict routing, by default "/foo" and "/foo/" are treated the same by the router
58 app.disable('x-powered-by'); // Enables the X-Powered-By: Express HTTP header, enabled by default
59
60 for (var i = 0; i < settings.view.engines.length; ++i) {
61 var extension = settings.view.engines[i].extension;
62 var template = settings.view.engines[i].template;
63 app.engine(extension, engines[template]);
64 }
65 app.set('view engine', settings.view.defaultExtension); // The default engine extension to use when omitted
66 app.set('views', path.join(__dirname, 'views')); // The view directory path
67
68 log.info('app.settings: %j', app.settings);
69 }(app));
70
71 // Multi-host
72 console.assert( ! _.isUndefined(middleware.multihost), 'lib/middleware/multihost not found');
73
74 (function(app) {
75 _.each(settings.multihost.routes, function(options) {
76 // Modules are cached after the first time they are loaded.
77 // The cached module must be invalidated to ensure data-independences in a multi-host environment.
78 var server_path = options.server;
79 if (require.cache[server_path]) {
80 delete require.cache[server_path];
81 }
82
83 if ( ! fs.statSync(path.resolve(server_path) + '.js') &&
84 ! fs.statSync(path.join(path.resolve(server_path), 'index.js'))) {
85 log.error('The multi-host server does not exist: %j', options);
86 return;
87 }
88
89 var server = require(server_path);
90 app.use(middleware.multihost({
91 hosts: options.hosts,
92 route: options.route,
93 server: server({ route: options.route })
94 }));
95
96 log.info('Attached a multi-host server: %j', options);
97 });
98 }(app));
99
100 // Error handling
101 console.assert( ! _.isUndefined(middleware.err_log), 'lib/middleware/err_log not found');
102 console.assert( ! _.isUndefined(middleware.err_client), 'lib/middleware/err_client not found');
103 console.assert( ! _.isUndefined(middleware.err_notfound), 'lib/middleware/err_notfound not found');
104 console.assert( ! _.isUndefined(middleware.err_server), 'lib/middleware/err_server not found');
105
106 app.use(middleware.err_log());
107 app.use(middleware.err_client({
108 error: 'XHR error'
109 }));
110 app.use(middleware.err_notfound({
111 view: path.join('common', '404.hogan'),
112 error: 'Not found'
113 }));
114 app.use(middleware.err_server({
115 view: path.join('common', '500.jade'),
116 error: 'Internal server error'
117 }));
118
119 return app;
120};