express-generator-typescript
Version:
Generate new Express applications similar to express-generate which but sets it up to use TypeScript instead
87 lines (64 loc) • 2.41 kB
text/typescript
import morgan from 'morgan';
import path from 'path';
import helmet from 'helmet';
import express, { Request, Response, NextFunction } from 'express';
import logger from 'jet-logger';
import 'express-async-errors';
import BaseRouter from '@src/routes';
import Paths from '@src/common/Paths';
import ENV from '@src/common/ENV';
import HttpStatusCodes from '@src/common/HttpStatusCodes';
import { RouteError } from '@src/common/route-errors';
import { NodeEnvs } from '@src/common/constants';
/******************************************************************************
Setup
******************************************************************************/
const app = express();
// **** Middleware **** //
// Basic middleware
app.use(express.json());
app.use(express.urlencoded({extended: true}));
// Show routes called in console during development
if (ENV.NodeEnv === NodeEnvs.Dev) {
app.use(morgan('dev'));
}
// Security
if (ENV.NodeEnv === NodeEnvs.Production) {
// eslint-disable-next-line n/no-process-env
if (!process.env.DISABLE_HELMET) {
app.use(helmet());
}
}
// Add APIs, must be after middleware
app.use(Paths.Base, BaseRouter);
// Add error handler
app.use((err: Error, _: Request, res: Response, next: NextFunction) => {
if (ENV.NodeEnv !== NodeEnvs.Test.valueOf()) {
logger.err(err, true);
}
let status = HttpStatusCodes.BAD_REQUEST;
if (err instanceof RouteError) {
status = err.status;
res.status(status).json({ error: err.message });
}
return next(err);
});
// **** FrontEnd Content **** //
// Set views directory (html)
const viewsDir = path.join(__dirname, 'views');
app.set('views', viewsDir);
// Set static directory (js and css).
const staticDir = path.join(__dirname, 'public');
app.use(express.static(staticDir));
// Nav to users pg by default
app.get('/', (_: Request, res: Response) => {
return res.redirect('/users');
});
// Redirect to login if not logged in.
app.get('/users', (_: Request, res: Response) => {
return res.sendFile('users.html', { root: viewsDir });
});
/******************************************************************************
Export default
******************************************************************************/
export default app;