Как добавить уникальный идентификатор для каждого запроса в Node.js или других технологиях? Метод с контекстом выполнения.
1️⃣ Контекст выполнения
Используем AsyncLocalStorage из Node.js, чтобы сохранять данные (например, уникальный ID) в контексте текущего запроса. Это позволяет избежать передачи данных явно через каждый слой приложения.
2️⃣ Middleware для генерации ID
Создаем middleware, которое генерирует уникальный ID для каждого запроса и сохраняет его в контексте.
3️⃣ Логгер с поддержкой ID
Добавляем уникальный ID в каждый лог. Логгер автоматически извлекает ID из контекста и добавляет его к сообщению.
Чем может помочь: уникальный ID для каждого запроса, то есть все логи одного запроса объединены одним ID, а также чистый код без передачи ID через каждый компонент.
Пример вывода:
Подходит для yau-ts (https://github.com/amadevstudio/yau-ts), Express или любого другого framework или библиотеки с поддержкой middleware
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