@mark01/express-utils
Version:
npm package that contains utilities for express.js
71 lines (70 loc) • 2.54 kB
JavaScript
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;
}
}