UNPKG

2.25 kBJavaScriptView Raw
1const express = require('express');
2const cookieParser = require('cookie-parser');
3const bodyParser = require('body-parser');
4const helmet = require('helmet');
5const hdtRequest = require('herodotus-middleware');
6
7let logger;
8
9function bootstrap(opts = {}) {
10
11 const app = express();
12
13 app.use(helmet());
14
15 if (opts.view_path) {
16 // view engine setup
17 app.set('views', opts.view_path);
18 app.set('view engine', 'pug');
19 }
20
21 if (opts.logger) {
22 logger = opts.logger;
23 const requestLogger = hdtRequest({
24 logger,
25 headerName: 'x-request-id'
26 });
27 app.use(requestLogger);
28 }
29
30 app.use(bodyParser.json());
31 app.use(bodyParser.urlencoded({ extended: false }));
32 app.use(cookieParser());
33
34 if (opts.static) {
35 opts.static.forEach((static) => {
36 app.use(express.static(static));
37 });
38 }
39
40 if (opts.passport) {
41 app.use(opts.passport.initialize());
42 }
43
44 if (opts.routes) {
45 Object.keys(opts.routes).forEach((path) => {
46 if (Array.isArray(opts.routes[path])) {
47 opts.routes[path].forEach((r) => {
48 app.use(path, r);
49 });
50 } else {
51 app.use(path, opts.routes[path]);
52 }
53 });
54 }
55
56 // catch 404 and forward to error handler
57 app.use(function(req, res, next) {
58 const err = new Error('Not Found');
59 err.status = 404;
60 next(err);
61 });
62
63 // error handler
64 // eslint-disable-next-line no-unused-vars
65 app.use(function(err, req, res, next) {
66 // render the error page
67 res.status(err.status || 500);
68 logger && logger.error(err);
69 res.json({err});
70 });
71
72 return app;
73}
74module.exports.bootstrap = bootstrap;
75
76
77function start(app) {
78 const http = require('http');
79 let server = http.createServer(app);
80
81 const port = process.env.PORT || 3000;
82 app.set('port', port);
83
84 server.listen(port);
85
86 server.on('listening', () => {
87 logger && logger.info({port}, 'started');
88 });
89
90 return server;
91}
92module.exports.start = start;
93
94module.exports.run = async (_module, opts) => {
95 let app = bootstrap(_module, opts);
96 let server = start(app);
97 let out = new Promise((pass, fail) => {
98 server.on('error', (err) => {
99 fail(err);
100 });
101 server.on('listening', () => {
102 pass(server);
103 });
104 });
105 return out;
106};