Как добавить уникальный идентификатор для каждого запроса в Node.js или других технологиях? Метод с контекстом выполнения.

1️⃣ Контекст выполнения
Используем AsyncLocalStorage из Node.js, чтобы сохранять данные (например, уникальный ID) в контексте текущего запроса. Это позволяет избежать передачи данных явно через каждый слой приложения.

const asyncLocalStorage = new AsyncLocalStorage<Map<string, unknown>>();

export default {
  run: <T>(callback: () => T): T => {
    const store = new Map<ContextKeys, unknown>();
    return asyncLocalStorage.run(store, callback);
  },
  set: (key: string, value: unknown): void => { ... },
  get: <T>(key: string): T => { ... },
};


2️⃣ Middleware для генерации ID
Создаем middleware, которое генерирует уникальный ID для каждого запроса и сохраняет его в контексте.

export const makeSetRequestIdMiddleware = (): CustomMiddleware =>
  async (_params, next) => {
    RequestContext.run(async () => {
      RequestContext.set("botRequestId", generateUniqueId());
      await next();
    });
  };

3️⃣ Логгер с поддержкой ID
Добавляем уникальный ID в каждый лог. Логгер автоматически извлекает ID из контекста и добавляет его к сообщению.

export class ProjectLogger {
  info(...args: unknown[]): void {
    this.logger.info(`[${RequestContext.get("botRequestId")}]`, ...args);
  }
  // Аналогично для warn, error, debug...
}


Чем может помочь: уникальный ID для каждого запроса, то есть все логи одного запроса объединены одним ID, а также чистый код без передачи ID через каждый компонент.

Пример вывода:

[INFO] [req_12345] User logged in
[WARN] [req_12345] Invalid parameter detected
[ERROR] [req_12345] Failed to process request

Подходит для yau-ts (https://github.com/amadevstudio/yau-ts), Express или любого другого framework или библиотеки с поддержкой middleware
 
 
Back to Top