131 lines
3.2 KiB
JavaScript
131 lines
3.2 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.NODE_PWD || process.cwd()
|
|
|
|
// 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')
|
|
const passport = require('passport')
|
|
|
|
// modules > express middlewares
|
|
const bodyParser = require('body-parser')
|
|
const session = require('express-session')
|
|
const cookieParser = require('cookie-parser')
|
|
|
|
// modules > 3rd party
|
|
const chalk = require('chalk')
|
|
|
|
// modules > warepot
|
|
const colorizeStack = require('warepot/util/colorize-stack')
|
|
|
|
// modules > locals
|
|
const initRoutes = require('warepot/util/init-routes')
|
|
|
|
const config = requireDir('./config')
|
|
|
|
// 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 prewares = [
|
|
express.static(config.dir.static, ENV === 'production' ? { maxAge: '1 year' } : null),
|
|
bodyParser.json(),
|
|
bodyParser.urlencoded({ extended: true }),
|
|
cookieParser(),
|
|
session(config.session),
|
|
passport.initialize(),
|
|
passport.session(),
|
|
]
|
|
|
|
if (ENV === 'development') {
|
|
// only log requests to console in development mode
|
|
prewares.unshift(require('morgan')('dev'))
|
|
prewares.push(require('express-module-membership/passport/automatic-login'))
|
|
}
|
|
|
|
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 = [
|
|
...prewares,
|
|
...require('./pages'),
|
|
...require('./services/pomodoros/routes'),
|
|
...require('express-module-membership/routes'),
|
|
...postwares
|
|
]
|
|
|
|
const server = express()
|
|
|
|
// get IP & whatnot from nginx proxy
|
|
server.set('trust proxy', true)
|
|
|
|
server.locals.site = require('./config/site')
|
|
|
|
if (ENV === 'production') {
|
|
Object.assign(server.locals, {
|
|
js: require(p.join(PWD, 'public/js.json')),
|
|
css: require(p.join(PWD, 'public/css.json'))
|
|
})
|
|
}
|
|
|
|
// override default response render method for
|
|
// more convenient use with marko
|
|
server.response.render = function (template) {
|
|
const locals = _.extend({}, server.locals, this.locals)
|
|
|
|
template.render(locals, this)
|
|
}
|
|
|
|
initRoutes(server, routes)
|
|
|
|
// mongoose mpromise library is being deprecated
|
|
mongoose.Promise = Promise
|
|
|
|
// connect to mongodb
|
|
mongoose.connect(config.mongo.uri, _.omit(config.mongo, 'uri'), (err) => {
|
|
if (err) {
|
|
console.error(err)
|
|
process.exit()
|
|
}
|
|
|
|
console.info('[' + chalk.cyan('INIT') + '] Mongoose is connected.')
|
|
})
|
|
|
|
server.listen(config.port, () => {
|
|
console.info('[' + chalk.cyan('INIT') + '] HTTP Server listening on port ' + chalk.magenta('%s') + ' (' + chalk.yellow('%s') + ')', config.port, ENV)
|
|
})
|
|
|
|
module.exports = server
|