Управление контекстом в экспресс-приложении

У меня есть внутренний проект регистратора.

До сих пор мы управляли контекстом глобальных параметров регистратора с помощью 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);
}

Как мне это сделать?

0 ответов

Другие вопросы по тегам