import * as createError from 'http-errors'; import * as express from 'express'; import {NextFunction, Request, Response} from 'express'; import * as path from 'path'; import * as redisStore from 'connect-redis'; import * as session from 'express-session'; import * as sassMiddleware from 'node-sass-middleware'; import indexRouter from './routes'; import {HttpLogger, Redis, Config, setupAuthProxy, getReloadRouter} from './utils'; import {Store} from 'express-session'; export const app = express(); // view engine setup app.set('views', path.join(__dirname, '../views')); app.set('view engine', 'pug'); app.use((req, res, next) => { res.locals.Config = Config; next(); }); const router = express.Router(); // http logger app.use(HttpLogger); app.use(express.json()); app.use(express.urlencoded({extended: false})); // auth proxy middleware router.use(setupAuthProxy); // auto reloader (when running in debug mode) router.use(getReloadRouter()); // session let sessionStore: Store|undefined = undefined; if (Redis.client) { const RedisStore = redisStore(session); sessionStore = new RedisStore({client: Redis.client}); } router.use(session({ store: sessionStore, secret: Config.SESSION_SECRET, resave: false, saveUninitialized: true, cookie: {secure: false}, })); // static config router.use(sassMiddleware({ src: path.join(__dirname, '../public'), dest: path.join(__dirname, '../public'), indentedSyntax: true, // true = .sass and false = .scss sourceMap: true, })); router.use(express.static(path.join(__dirname, '../public'))); router.use(indexRouter); app.use(Config.BASE_PATH, router); // catch 404 and forward to error handler app.use((req, res, next) => { next(createError(404)); }); // error handler app.use((err: Error&{status?: number}, req: Request, res: Response, next: NextFunction) => { if (res.headersSent) { return next(err); } // set locals, only providing error in development res.locals.message = err.message; res.locals.error = !Config.isProduction ? err : {}; // render the error page res.status(err.status || 500); res.render('error'); return undefined; });