Files
node-template-express/backend/src/app.ts
2020-11-24 00:39:20 +01:00

82 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 sassMiddleware from 'node-sass-middleware';
import * as compression from 'compression';
import indexRouter from './routes';
import {AuthProxy, AutoReloader, DefaultConfig, HttpLogger, Polyfill, PermManager} from 'pkg-express-utils';
export const app = express();
// Permissions
PermManager
.grant('user')
.execute('read').on('userinfo')
.grant('coe_bs')
.extend('user')
.execute('write').on('userinfo');
// view engine setup
app.set('views', path.join(__dirname, '../views'));
app.set('view engine', 'pug');
app.use((req, res, next) => {
res.locals.DefaultConfig = DefaultConfig;
next();
});
// http logger
app.use(HttpLogger);
app.use(express.json());
app.use(express.urlencoded({extended: false}));
// compression
app.use(compression());
const router = express.Router();
// auth proxy middleware
router.use(AuthProxy.router);
// auto reloader (when running in debug mode)
router.use(AutoReloader.getRouter({
frontendDirs: './public',
}));
// session
//router.use(Session.getRouter());
// static config
router.use('/js/polyfill.js', Polyfill.getRouter('./public/js/bundle.js'));
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(DefaultConfig.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 = !DefaultConfig.isProduction ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
return undefined;
});