UNPKG

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