124 lines
3.4 KiB
JavaScript
124 lines
3.4 KiB
JavaScript
'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;
|