1 |
|
2 | var 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 |
|
14 | var middleware = {};
|
15 |
|
16 | fs.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 |
|
24 | module.exports = function(options) {
|
25 | options = options || {};
|
26 |
|
27 |
|
28 | var app = express();
|
29 | var errorhandler = require('errorhandler');
|
30 |
|
31 |
|
32 | logger.init(settings.winston);
|
33 | logger.registerAppHelper(app);
|
34 |
|
35 | var log = logger();
|
36 |
|
37 |
|
38 | (function(app) {
|
39 | var env = process.env.NODE_ENV || 'development';
|
40 | if ('development' === env) {
|
41 |
|
42 |
|
43 |
|
44 | app.use(errorhandler());
|
45 |
|
46 |
|
47 | app.enable('verbose errors');
|
48 | app.disable('view cache');
|
49 | } else {
|
50 |
|
51 | app.disable('verbose errors');
|
52 | app.enable('view cache');
|
53 | }
|
54 |
|
55 | app.enable('trust proxy');
|
56 | app.enable('case sensitive routing');
|
57 | app.disable('strict routing');
|
58 | app.disable('x-powered-by');
|
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);
|
66 | app.set('views', path.join(__dirname, 'views'));
|
67 |
|
68 | log.info('app.settings: %j', app.settings);
|
69 | }(app));
|
70 |
|
71 |
|
72 | console.assert( ! _.isUndefined(middleware.multihost), 'lib/middleware/multihost not found');
|
73 |
|
74 | (function(app) {
|
75 | _.each(settings.multihost.routes, function(options) {
|
76 |
|
77 |
|
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 |
|
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 | };
|