import ApplicationComponent from "../ApplicationComponent"; import express, {Express, RequestHandler, Router} from "express"; import Logger from "../Logger"; import {Server} from "http"; import {IncomingForm} from "formidable"; import {FileError, ValidationBag} from "../db/Validator"; export default class ExpressAppComponent extends ApplicationComponent { private readonly port: number; private server?: Server; constructor(port: number) { super(); this.port = port; } public async start(app: Express, router: Router): Promise { this.server = app.listen(this.port, 'localhost', () => { Logger.info(`Web server running on localhost:${this.port}.`); }); router.use(express.json()); router.use(express.urlencoded({ extended: true, })); router.use((req, res, next) => { req.models = {}; req.modelCollections = {}; next(); }); } public async stop(): Promise { if (this.server) { await this.close('Webserver', this.server, this.server.close); } } public getServer(): Server { if (!this.server) throw 'Server was not initialized.'; return this.server; } } export const FILE_UPLOAD_MIDDLEWARE: (formFactory: () => IncomingForm, defaultField: string) => RequestHandler = (formFactory: () => IncomingForm, defaultField: string) => { return async (req, res, next) => { const form = formFactory(); try { await new Promise((resolve, reject) => { form.parse(req, (err, fields, files) => { if (err) { reject(err); return; } req.body = fields; req.files = files; resolve(); }); }); } catch (e) { const bag = new ValidationBag(); const fileError = new FileError(e); fileError.thingName = defaultField; bag.addMessage(fileError); next(bag); return; } next(); }; };