From 19c8b86ff83c2fe8e966d4bd62518ce47b39e951 Mon Sep 17 00:00:00 2001 From: Alice Gaudon Date: Sun, 24 Jan 2021 16:35:33 +0100 Subject: [PATCH] Fix express body parsing middlewares corrupting AsyncLocalStorage Closes #17 --- src/Logger.ts | 13 +++++++++++++ src/components/ExpressAppComponent.ts | 10 +++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/Logger.ts b/src/Logger.ts index f970913..05ceee6 100644 --- a/src/Logger.ts +++ b/src/Logger.ts @@ -25,3 +25,16 @@ export const loggingContextMiddleware: RequestHandler = (req, res, next) => { next(); }); }; + +export const preventContextCorruptionMiddleware = (delegate: RequestHandler): RequestHandler => ( + req, + res, + next, +) => { + const data = requestIdStorage.getStore() as string; + + delegate(req, res, (err?: Error | 'router') => { + requestIdStorage.enterWith(data); + next(err); + }); +}; diff --git a/src/components/ExpressAppComponent.ts b/src/components/ExpressAppComponent.ts index 47ba393..5ab489a 100644 --- a/src/components/ExpressAppComponent.ts +++ b/src/components/ExpressAppComponent.ts @@ -1,6 +1,6 @@ import ApplicationComponent from "../ApplicationComponent"; import express, {Express, Router} from "express"; -import {logger} from "../Logger"; +import {logger, preventContextCorruptionMiddleware} from "../Logger"; import {Server} from "http"; import compression from "compression"; import Middleware from "../Middleware"; @@ -30,12 +30,12 @@ export default class ExpressAppComponent extends ApplicationComponent { } public async init(router: Router): Promise { - router.use(express.json({ + router.use(preventContextCorruptionMiddleware(express.json({ type: req => req.headers['content-type']?.match(/^application\/(.+\+)?json$/), - })); - router.use(express.urlencoded({ + }))); + router.use(preventContextCorruptionMiddleware(express.urlencoded({ extended: true, - })); + }))); // gzip router.use(compression());