Add request parsing middlewares to controllers

This commit is contained in:
Alice Gaudon 2020-06-14 16:26:36 +02:00
parent a2ef0f6a42
commit adf380c19d
6 changed files with 45 additions and 4 deletions

View File

@ -1,6 +1,6 @@
{
"name": "wms-core",
"version": "0.7.6",
"version": "0.7.12",
"description": "Node web framework",
"repository": "git@gitlab.com:ArisuOngaku/wms-core.git",
"author": "Alice Gaudon <alice@gaudon.pro>",

View File

@ -1,4 +1,4 @@
import express, {NextFunction, Request, Response, Router} from 'express';
import express, {NextFunction, Request, RequestHandler, Response, Router} from 'express';
import {BadRequestError, HttpError, NotFoundHttpError, ServerError, ServiceUnavailableHttpError} from "./HttpError";
import {lib} from "nunjucks";
import Logger from "./Logger";
@ -170,6 +170,12 @@ export default abstract class Application {
});
}
public setupRequestParsingMiddlewares(router: Router) {
for (const controller of this.controllers) {
controller.setupRequestParsingMiddlewares(router);
}
}
public getWebSocketListeners(): { [p: string]: WebSocketListener } {
return this.webSocketListeners;
}

View File

@ -39,6 +39,9 @@ export default abstract class Controller {
return [];
}
public setupRequestParsingMiddlewares(router: Router): void {
}
public hasGlobalHandlers(): boolean {
return this.getGlobalHandlers().length > 0;
}

View File

@ -1,7 +1,9 @@
import ApplicationComponent from "../ApplicationComponent";
import express, {Express, Router} from "express";
import express, {Express, NextFunction, Request, Response, Router} from "express";
import Logger from "../Logger";
import {Server} from "http";
import {MulterError} from "multer";
import {FileError, ValidationBag} from "../db/Validator";
export default class ExpressAppComponent extends ApplicationComponent<void> {
private readonly port: number;
@ -17,6 +19,22 @@ export default class ExpressAppComponent extends ApplicationComponent<void> {
Logger.info(`Web server running on localhost:${this.port}.`);
});
this.app?.setupRequestParsingMiddlewares(router);
// Multer error handler
router.use((err: any, req: Request, res: Response, next: NextFunction) => {
if (err instanceof MulterError) {
const bag = new ValidationBag();
const validationError = new FileError(err.message);
validationError.thingName = err.field;
bag.addMessage(validationError);
req.flash('validation', bag.getMessages());
res.redirectBack();
} else {
next(err);
}
});
router.use(express.json());
router.use(express.urlencoded({
extended: true,

View File

@ -34,6 +34,7 @@ export default class LogRequestsComponent extends ApplicationComponent<void> {
query: req.query,
params: req.params,
body: req.body,
file: req.file,
files: req.files,
cookies: req.cookies,
sessionId: req.sessionID,

View File

@ -409,4 +409,17 @@ export class UnknownRelationValidationError extends ValidationError {
public get message(): string {
return `${this.thingName}=${this.value} relation was not found in ${this.table}${this.foreignKey !== undefined ? `.${this.foreignKey}` : ''}.`;
}
}
}
export class FileError extends ValidationError {
private readonly m: string;
constructor(message: string) {
super();
this.m = message;
}
public get message(): string {
return `${this.m}`;
}
}