1 | const express = require('express');
|
2 | const get = require('lodash/get');
|
3 |
|
4 | const helmet = require('./middlewares/helmet');
|
5 | const cors = require('./middlewares/cors');
|
6 |
|
7 | const {
|
8 | createRequestLogger,
|
9 | createErrorLogger,
|
10 | loggerMiddleware,
|
11 | genStackdriverLogTraceMw
|
12 | } = require('./log');
|
13 |
|
14 | const genApp = (opts = {}) => {
|
15 |
|
16 | const {
|
17 | logger,
|
18 | sd_mw
|
19 | } = opts;
|
20 |
|
21 | const app = express();
|
22 |
|
23 | app.use(helmet());
|
24 | app.use(cors());
|
25 |
|
26 | app.set('trust proxy', true);
|
27 |
|
28 |
|
29 |
|
30 | app.use('/_ah/start', (req, res) => res.json({success: true}));
|
31 | app.use('/_ah/stop', (req, res) => res.json({success: true}));
|
32 | app.use('/_ah/warmup', (req, res) => res.json({success: true}));
|
33 | app.use('/_ah/health_check', (req, res) => res.json({success: true}));
|
34 |
|
35 | if (logger) {
|
36 | app.use(createRequestLogger({logger}));
|
37 | app.logger = logger;
|
38 |
|
39 | if (typeof sd_mw !== 'function') {
|
40 | app.use(loggerMiddleware({logger}));
|
41 | }
|
42 | }
|
43 |
|
44 | if (typeof sd_mw === 'function')
|
45 | app.use(sd_mw);
|
46 |
|
47 | if (sd_mw === true)
|
48 | return genStackdriverLogTraceMw(logger)
|
49 | .then(sd_mw => {
|
50 | app.use(sd_mw);
|
51 | return app;
|
52 | })
|
53 | ;
|
54 |
|
55 | return app;
|
56 | };
|
57 |
|
58 | const addErrorHandler = (app, logger, debug) => {
|
59 |
|
60 | const isProduction = process.env.NODE_ENV === 'production';
|
61 | const showStack = !isProduction || process.env.DEBUG || debug;
|
62 |
|
63 |
|
64 | if (logger)
|
65 | app.use(createErrorLogger({logger}));
|
66 |
|
67 | app.use((err, req, res, next) => {
|
68 |
|
69 | const log = req.log || logger;
|
70 |
|
71 |
|
72 | const shouldTriggerError = isProduction && (!err.statusCode || err.statusCode >= 500);
|
73 | if (log && shouldTriggerError)
|
74 | log.error(err.message, err);
|
75 |
|
76 | res.status(err.statusCode || 500).json({
|
77 | success: false,
|
78 | error: {
|
79 | message: get(err, 'originalError.message', err.message),
|
80 | code: get(err, 'originalError.code', err.code),
|
81 | stack: showStack ? err.stack.split('\n') : undefined
|
82 | }
|
83 | });
|
84 | });
|
85 | };
|
86 |
|
87 | const addApiServiceRoutes = (app, path, routes, serviceName) => {
|
88 |
|
89 | app.use(path, routes);
|
90 |
|
91 |
|
92 | if (serviceName)
|
93 | app.use(`/api/${serviceName}${path}`, routes);
|
94 | };
|
95 |
|
96 | module.exports = {
|
97 | genApp,
|
98 | static: express.static,
|
99 | Router: express.Router,
|
100 | createErrorLogger,
|
101 | addErrorHandler,
|
102 | addApiServiceRoutes
|
103 | }; |
\ | No newline at end of file |