UNPKG

4.5 kBJavaScriptView Raw
1var fileExists = require('fs').existsSync,
2 path = require('path');
3
4var log = require('xqnode-logger'),
5 express = require('express'),
6 glob = require('glob'),
7 async = require('async');
8
9module.exports = function() {
10 "use strict";
11
12 var app, cbDone;
13
14 var ExpressServer = function(conf) {
15 conf = conf || {};
16
17
18 if (conf.logLevel) {
19 log.setLevel(conf.logLevel);
20 }
21 else {
22 log.setLevel('sys');
23 }
24
25 //Default port
26 this.port = conf.port || 3000;
27
28 //Default name
29 this.name = conf.name || 'Express server';
30
31 //Base dir
32 this.baseDir = conf.baseDir || process.cwd();
33
34 //API route (Default is disabled)
35 this.apiRoute = conf.apiRoute || null;
36
37 this.allRoutes = [];
38
39 app = express();
40 this.app = app;
41 };
42
43 /**
44 * Starts an express server
45 *
46 * @method start
47 */
48 ExpressServer.prototype.start = function(opts, callback) {
49 opts = opts || {
50 disableServer: false
51 };
52
53 cbDone = false;
54 if (!callback) {
55 callback = function() {};
56 }
57
58 app.addRoute = function(method, path, info, options, callback) {
59 if (typeof options === 'function') {
60 callback = options;
61 options = null;
62 }
63
64 var fn = Array.prototype.slice.call(arguments);
65 while(fn.length > 0 && typeof fn[0] !== 'function') {
66 fn.shift();
67 }
68
69 fn.unshift(path);
70 app[method].apply(app, fn);
71 this.allRoutes.push({
72 method: method,
73 path: path,
74 info: info,
75 options: options,
76 callback: callback
77 });
78 }.bind(this);
79
80 log.sys('Starting ' + this.name);
81 log.sys(' ... environment:', app.get('env'));
82 log.sys(' ... set base dir to:', this.baseDir);
83
84 // app.use(express.logger('dev'));
85 // app.engine('.hbs', require('hbs').__express);
86 // app.set('view engine', 'hbs');
87 // app.set('views', path.join(this.baseDir, 'views'));
88 app.baseDir = this.baseDir;
89
90 var jobs = [];
91
92 //Load Environment configuration
93 var envConf = path.join(this.baseDir, 'server/env', app.get('env') + '.js');
94 if (fileExists(envConf)) {
95 jobs.push(function(callback) {
96 log.sys(' ... load environment config');
97 require(envConf).call(this, app, callback);
98 }.bind(this));
99 }
100 else {
101 log.sys(' ... no environment config found!');
102 }
103
104 //Load express.js
105 var expressFile = path.join(app.baseDir, 'server/express.js');
106 if (fileExists(expressFile)) {
107 jobs.push(function(callback) {
108 log.sys(' ... Load express.js');
109 require(expressFile)(app, callback);
110 }.bind(this));
111 }
112
113 //Load database.js
114 var databaseFile = path.join(app.baseDir, 'server/database.js');
115 if (fileExists(databaseFile)) {
116 jobs.push(function(callback) {
117 log.sys(' ... Load database.js');
118 require(databaseFile)(app, callback);
119 }.bind(this));
120 }
121
122 //Load routes
123 if (opts.disableRoutes !== true) {
124 jobs.push(function(callback) {
125 var routesDir = path.join(this.baseDir, 'routes/**/*.js');
126 var files = glob.sync(routesDir);
127 if (files.length !== 0) {
128 files.forEach(function(file) {
129 log.sys(' ... load route', file);
130 require(file).call(this, app, callback);
131 }.bind(this));
132 }
133 else {
134 callback();
135 }
136 }.bind(this));
137 }
138
139 //Load API view
140 if (this.apiRoute) {
141 jobs.push(function(callback) {
142 log.sys(' ... register api route', this.apiRoute);
143 require(path.join(__dirname, 'routes/api')).call(this, app);
144 callback();
145 }.bind(this));
146 }
147
148 async.series(jobs, function(err, result) {
149 if (cbDone) {
150 return;
151 }
152
153 cbDone = true;
154
155 if (err) {
156 log.err('Can\'t boot the server.');
157 log.err((err.message || err));
158 process.exit(1);
159 return;
160 }
161
162 app.use(function(err, req, res, next) {
163 console.error(err.stack);
164 res.send(500, 'Something broke!\n');
165 });
166
167 if (opts.disableServer !== true) {
168 log.sys(' ... listening on port ', this.port);
169 log.sys('Server start was successfull!');
170 app.listen(this.port);
171 }
172
173 //Load init script
174 var initFile = path.join(app.baseDir, 'server/init.js');
175 if (fileExists(initFile)) {
176 require(initFile)(app, callback.bind(this, app));
177 }
178 else {
179
180 callback.call(this, app);
181 }
182
183 }.bind(this));
184
185 return app;
186 };
187
188 /**
189 * Stopping express server
190 */
191 ExpressServer.prototype.stop = function() {
192 log.sys('Stoping ' + this.name);
193 };
194
195 /**
196 * Handle JSON result
197 */
198 ExpressServer.prototype.handleJSONResult = function(err, data) {
199 if (err) {
200 log.err(err);
201 this.send(500, 'Something went wrong!');
202 return;
203 }
204
205 this.json(data);
206 };
207
208 return ExpressServer;
209
210}();
\No newline at end of file