swaf/src/components/ExpressAppComponent.ts

72 lines
2.2 KiB
TypeScript

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<void> {
private readonly port: number;
private server?: Server;
constructor(port: number) {
super();
this.port = port;
}
public async start(app: Express, router: Router): Promise<void> {
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<void> {
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<any>((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();
};
};