1 |
|
2 |
|
3 |
|
4 | var fs = require('fs'),
|
5 | path = require('path'),
|
6 | connect = require('connect'),
|
7 | express = require('express'),
|
8 | engines = require('consolidate'),
|
9 | i18n = require('i18next'),
|
10 | urljoin = require('./lib/urljoin'),
|
11 | _ = require('lodash'),
|
12 | logger = require('./lib/logger'),
|
13 | settings = require('./config/settings');
|
14 |
|
15 |
|
16 | var middleware = {};
|
17 |
|
18 | fs.readdirSync(__dirname + '/lib/middleware').forEach(function(filename) {
|
19 | if ( ! /\.js$/.test(filename)) {
|
20 | return;
|
21 | }
|
22 | var name = path.basename(filename, '.js');
|
23 | middleware[name] = require('./lib/middleware/' + name);
|
24 | });
|
25 |
|
26 | module.exports = function(options) {
|
27 | options = options || {};
|
28 |
|
29 |
|
30 | settings.route = options.route || settings.route;
|
31 |
|
32 |
|
33 | var app = express();
|
34 | var errorhandler = require('errorhandler');
|
35 | var favicon = require('serve-favicon');
|
36 | var cookieParser = require('cookie-parser');
|
37 | var bodyParser = require('body-parser');
|
38 |
|
39 | var multiparty = require('connect-multiparty');
|
40 | var methodOverride = require('method-override');
|
41 | var morgan = require('morgan');
|
42 | var compress = require('compression');
|
43 | var serveStatic = require('serve-static');
|
44 |
|
45 |
|
46 | logger.init(settings.winston);
|
47 | logger.registerAppHelper(app);
|
48 |
|
49 | var log = logger();
|
50 |
|
51 |
|
52 | i18n.init(settings.i18next);
|
53 | i18n.registerAppHelper(app);
|
54 |
|
55 |
|
56 | (function(app) {
|
57 | var env = process.env.NODE_ENV || 'development';
|
58 | if ('development' === env) {
|
59 |
|
60 |
|
61 |
|
62 | app.use(errorhandler());
|
63 |
|
64 |
|
65 | app.enable('verbose errors');
|
66 | app.disable('view cache');
|
67 | } else {
|
68 |
|
69 | app.disable('verbose errors');
|
70 | app.enable('view cache');
|
71 | }
|
72 |
|
73 | app.enable('trust proxy');
|
74 | app.enable('case sensitive routing');
|
75 | app.disable('strict routing');
|
76 | app.disable('x-powered-by');
|
77 |
|
78 | for (var i = 0; i < settings.view.engines.length; ++i) {
|
79 | var extension = settings.view.engines[i].extension;
|
80 | var template = settings.view.engines[i].template;
|
81 | app.engine(extension, engines[template]);
|
82 | }
|
83 | app.set('view engine', settings.view.defaultExtension);
|
84 | app.set('views', path.join(__dirname, 'views'));
|
85 |
|
86 | log.info('app.settings: %j', app.settings);
|
87 | }(app));
|
88 |
|
89 |
|
90 | app.use(function (req, res, next) {
|
91 | res.removeHeader('X-Powered-By');
|
92 | next();
|
93 | });
|
94 |
|
95 |
|
96 |
|
97 |
|
98 |
|
99 |
|
100 | app.use(favicon(path.join(__dirname, '../web/favicon.ico')));
|
101 | app.use(cookieParser());
|
102 |
|
103 |
|
104 |
|
105 | app.use(bodyParser.json(settings.middleware['body-parser']['json']));
|
106 | app.use(bodyParser.urlencoded(settings.middleware['body-parser']['urlencoded']));
|
107 |
|
108 |
|
109 |
|
110 |
|
111 | app.use(multiparty(settings.middleware['multiparty']));
|
112 |
|
113 |
|
114 |
|
115 |
|
116 | app.use(require('connect-restreamer')());
|
117 |
|
118 | app.use(methodOverride());
|
119 | app.use(morgan(settings.middleware['morgan']));
|
120 | app.use(compress(settings.middleware['compression']));
|
121 |
|
122 | _.each(settings.assets, function(asset, name) {
|
123 | log.info('assets: name=%s, asset=%s', name, JSON.stringify(asset));
|
124 |
|
125 | if ( ! asset.path) {
|
126 | log.error('asset path is not defined');
|
127 | return;
|
128 | }
|
129 |
|
130 | _.each(asset.routes, function(asset_route) {
|
131 | var route = urljoin(settings.route || '/', asset_route || '');
|
132 | log.info('> route=%s', name, route);
|
133 | app.use(route, serveStatic(asset.path, {
|
134 | maxAge: asset.maxAge
|
135 | }));
|
136 | });
|
137 | });
|
138 |
|
139 |
|
140 | app.use(i18n.handle);
|
141 |
|
142 |
|
143 |
|
144 |
|
145 | var routes = require('./routes/main');
|
146 | routes.init(app);
|
147 |
|
148 |
|
149 | console.assert( ! _.isUndefined(middleware.err_log), 'lib/middleware/err_log not found');
|
150 | console.assert( ! _.isUndefined(middleware.err_client), 'lib/middleware/err_client not found');
|
151 | console.assert( ! _.isUndefined(middleware.err_notfound), 'lib/middleware/err_notfound not found');
|
152 | console.assert( ! _.isUndefined(middleware.err_server), 'lib/middleware/err_server not found');
|
153 |
|
154 | app.use(middleware.err_log());
|
155 | app.use(middleware.err_client({
|
156 | error: 'XHR error'
|
157 | }));
|
158 | app.use(middleware.err_notfound({
|
159 | view: path.join('common', '404.hogan'),
|
160 | error: 'Not found'
|
161 | }));
|
162 | app.use(middleware.err_server({
|
163 | view: path.join('common', '500.jade'),
|
164 | error: 'Internal server error'
|
165 | }));
|
166 |
|
167 | return app;
|
168 | };
|