Управление контекстом в экспресс-приложении
У меня есть внутренний проект регистратора.
До сих пор мы управляли контекстом глобальных параметров регистратора с помощью httpContext.
import * as httpContext from 'express-http-context';
что httpContext в основном создает контекст для каждого потока HTTP-запросов, и мы добавляем параметры журнала в начале потока, которые будут присоединяться как журналы параметров на всем пути.
Этот код находится внутри проекта внутреннего логгера: обновление параметров лога:
setLogParameters(logParams: any): void {
if (logParams) {
const existingParams = httpContext.get('logParams');
logParams = { ...logParams, ...existingParams };
httpContext.set('logParams', logParams);
}
}
присоединение httpContext как logParams к фактической информации журнала, которую использует служба.
const addAppNameFormat = format((info) => {
if (httpContext) {
info = {
...info,
...httpContext.get('logParams')
};
}
return info;
});
Проблема с этим решением — есть сценарии, которые не запускаются HTTP-запросом — например, извлечение сообщения из подписки Pub Sub) — в этих сценариях переменная контекста HTTP не инициализируется — потому что нет нового HTTP-запроса.
Я попытался имитировать поведение экспресс-http-контекста -https://github.com/skonves/express-http-context/blob/master/index.js и создать свой собственный объект контекста. В экспресс-http-контексте — я основывался на экспресс-сервере, который прослушивает HTTP-запросы — таким образом, он действительно открывает новый сеанс для каждого запроса:
//on my app.ts
this.app.use(httpContext.middleware);
//on express-http-context
'use strict';
const cls = require('cls-hooked');
const nsid = 'a6a29a6f-6747-4b5f-b99f-07ee96e32f88';
const ns = cls.createNamespace(nsid);
/** Express.js middleware that is responsible for initializing the context for each request. */
function middleware(req, res, next) {
ns.run(() => next());
}
Как я могу активировать определенную точку для открытия нового сеанса?
Это, например, не работает - мне нужно выполнить функцию промежуточного программного обеспечения - и ей нужно каким-то образом принять параметр [next: NextFunction].
function handlePulledMessage(message: any, ....) {
loggerContext.middleware;
loggerContext.set('X', 100);
loggerContext.set('Y', 200);
loggerContext.set('Z', 300);
}
Как мне это сделать?