'use strict' /* * The main file that sets up the Express instance and node * * @module server/server * @type {Express instance} */ global.ENV = process.env.NODE_ENV || 'development' global.PWD = process.env.NODE_PWD || process.cwd() // modules > native const p = require('path') if (ENV === 'development') { // output filename in console log and colour console.dir require('midwest/util/console') // needed so symlinked modules get access to main projects node_modules/ require('app-module-path').addPath(p.join(PWD, 'node_modules')) } // modules > 3rd party const _ = require('lodash') const chalk = require('chalk') const express = require('express') const requireDir = require('require-dir') // modules > express middlewares const bodyParser = require('body-parser') // modules > midwest const colorizeStack = require('midwest/util/colorize-stack') // make error output stack pretty process.on('uncaughtException', (err) => { console.error(chalk.red('UNCAUGHT EXCEPTION')) if (err.stack) { console.error(colorizeStack(err.stack)) } else { console.error(err) } process.exit(1) }) const config = requireDir('./config', { mapKey: (value, key) => _.camelCase(key) }) const prewares = [ express.static(config.dir.static, ENV === 'production' ? { maxAge: '1 year' } : null), bodyParser.json(), bodyParser.urlencoded({ extended: true }), ] if (ENV === 'development') { // only log requests to console in development mode prewares.unshift(require('morgan')('dev')) // prewares.push(require('midwest-module-membership/passport/automatic-login')); } const postwares = [ require('midwest/middleware/ensure-found'), // transform and log error require('midwest/factories/error-handler')(config.errorHandler), // respond require('midwest/middleware/responder'), ] const server = express() // get IP & whatnot from nginx proxy server.set('trust proxy', true) _.extend(server.locals, { site: require('./config/site'), }) // override default response render method for // more convenient use with marko server.response.render = function (template) { const locals = Object.assign({ query: this.req.query }, this.app.locals, this.locals) this.send(template(locals)) } try { server.locals.js = require(p.join(PWD, 'public/js.json')) } catch (e) {} try { server.locals.css = require(p.join(PWD, 'public/css.json')) } catch (e) {} // load prewares server.use(...prewares) // mount routers server.use(require('./routers/index')) server.use('/api', require('./routers/api')) // server.use('/auth', require('midwest-module-membership/passport/router')); // load postwares server.use(...postwares) // Only start Express server when it is the main module (ie not required by test) if (require.main === module) { server.http = server.listen(config.port, () => { console.info( `[${chalk.cyan('INIT')}] HTTP Server listening on port ${chalk.magenta(config.port)} (${chalk.yellow(ENV)})`, ) }) } module.exports = server