81 lines
2.1 KiB
TypeScript
81 lines
2.1 KiB
TypeScript
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;
|
|
});
|
|
|
|
|