UNPKG

@mark01/express-utils

Version:

npm package that contains utilities for express.js

71 lines (70 loc) 2.54 kB
import compression from 'compression'; import cors from 'cors'; import express from 'express'; import helmet from 'helmet'; import hpp from 'hpp'; import morgan from 'morgan'; import { defaultHandleOperationalErrors, errorHandler, } from '../error'; import accept from '../middlewares/accept'; import busyHandler from '../middlewares/busy-handler'; import favicon from '../middlewares/favicon'; import { errorLogger, successLogger } from '../middlewares/logger'; import notFound from '../middlewares/not-found'; import slowDown from '../middlewares/slow-down'; import xRequestedWith from '../middlewares/x-requested-with'; import xst from '../middlewares/xst'; export class Api { app; redis; trustProxy; morganFormat; errorHandlerConfig; constructor(options) { this.app = express(); this.redis = options.redis; this.trustProxy = options.trustProxy ?? false; this.morganFormat = options.morganFormat ?? 'dev'; this.errorHandlerConfig = options.errorHandlerConfig ?? { environment: 'development', handleOperationalErrors: defaultHandleOperationalErrors, }; this.configureApp(options.corsOptions); this.applyMiddlewares(options.extraMiddlewares); this.applyHandlers(options.handlers, options.apiRateLimit); this.applyErrorHandlers(); } configureApp(corsOptions) { if (this.trustProxy) this.app.enable('trust proxy'); this.app.use(helmet({ frameguard: { action: 'deny' }, hidePoweredBy: false })); this.app.use(cors(corsOptions)); this.app.use(xRequestedWith()); this.app.use(accept()); this.app.use(busyHandler()); this.app.use(hpp()); this.app.use(xst()); this.app.use(favicon()); this.app.use(compression()); this.app.use(morgan(this.morganFormat)); this.app.use(successLogger); } applyMiddlewares(extraMiddlewares) { if (extraMiddlewares) { extraMiddlewares.forEach((middleware) => this.app.use(middleware)); } } applyHandlers(handlers, apiRateLimit = 75) { this.app.use('/api', slowDown(this.redis, apiRateLimit)); handlers.forEach(({ path, handler }) => { this.app.use(path, handler); }); this.app.all('*', notFound()); } applyErrorHandlers() { this.app.use(errorLogger); this.app.use(errorHandler(this.errorHandlerConfig)); } getApp() { return this.app; } }