'use strict'; require('babel-register'); /* * The main file that sets up the Express instance and node * * @module server/server * @type {Express instance} */ // set up some globals (these are also set in Epiphany if not already set) global.ENV = process.env.NODE_ENV || 'development'; global.PWD = process.env.PWD || process.cwd(); // set default compiler options in marko // this needs to be set like this to ensure the compiler // uses this setting when generating custom tags from marko.json files //require('marko/compiler').defaultOptions.writeToDisk = false; // make node understand `*.marko` files require('marko/node-require').install(); // modules > native const p = require('path'); // modules > 3rd party const requireDir = require('require-dir'); const _ = require('lodash'); const express = require('express'); const mongoose = require('mongoose'); // modules > express middlewares const bodyParser = require('body-parser'); const session = require('express-session'); const cookieParser = require('cookie-parser'); const appModulePath = require('app-module-path'); // needed when symlinking warepot/mongopot/hats appModulePath.addPath(p.join(process.env.PWD, 'node_modules')); appModulePath.addPath(p.join(process.env.PWD, 'modules')); const chalk = require('chalk'); const colorizeStack = require('warepot/util/colorize-stack'); // make error output stack pretty process.on('uncaughtException', function (err) { console.error(chalk.red('UNCAUGHT EXCEPTION')); console.error(err); console.log(err.fileName); console.log(err.message); console.log(err.name); console.log(colorizeStack(err.stack)); //logError(err, null, { console: true, database: false }); process.exit(1); }); const initRoutes = require('warepot/util/init-routes'); const config = requireDir('./config'); const prewares = [ express.static(config.dir.static, ENV === 'production' ? { maxAge: '1 year' } : null), express.static(config.dir.uploads, ENV === 'production' ? { maxAge: '1 year' } : null), bodyParser.json(), bodyParser.urlencoded({ extended: true }), cookieParser(config.session.secret), session(config.session), ]; if (ENV === 'development') { // only log requests to console in development mode prewares.unshift(require('morgan')('dev')); } // set up default postwares const postwares = [ require('warepot/ensure-found'), // transform and log error require('warepot/error-handler'), // respond require('warepot/responder'), // handle error rendering error require('warepot/responder-error'), ]; const routes = [].concat( prewares, require('./routes'), postwares ); const server = express(); // see http://expressjs.com/en/4x/api.html#app.settings.table server.set('trust proxy', true); _.extend(server.locals, { site: require('./config/site'), lang: process.env.NODE_LANG || 'en', js: require(p.join(PWD, 'public/js.json')), css: require(p.join(PWD, 'public/css.json')) }); initRoutes(server, routes); // override default res.render so we can use loaded marko templates, ie `res.render(markoTemplate)` express.response.render = function (template) { const locals = _.extend({}, server.locals, this.locals); template.render(locals, this); }; // connect to mongodb mongoose.connect(config.mongo.uri, _.omit(config.mongo, 'uri')); // start server and let them know it server.listen(config.port, () => { console.info('Express server started on port %s (%s)', config.port, ENV); }); module.exports = server;