Выбор ответа Middle Ошибки и логирование обновлено

Request id через всю цепочку

Вопрос

Нужно, чтобы каждая строка лога внутри обработки запроса содержала его request id, не передавая его аргументом в каждую функцию. Что использовать в Node?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: AsyncLocalStorage из node:asynchooks. AsyncLocalStorage хранит контекст, который сохраняется через await, таймеры и колбэки внутри als.run(store, fn).

Варианты ответа

  1. AsyncLocalStorage из node:async_hooksправильный ответ
  2. Глобальную переменную currentRequestId в модуле
  3. process.env.REQUEST_ID
  4. worker_threads по воркеру на запрос

Разбор

AsyncLocalStorage хранит контекст, который сохраняется через await, таймеры и колбэки внутри als.run(store, fn). Логгер берёт id из als.getStore(). Так делают и трассировка OpenTelemetry, и request-scoped логгеры.

  • Глобальная переменная перезапишется параллельным запросом: их много одновременно.
  • process.env общий на процесс, проблема та же.
  • Воркер на запрос дорог и не решает задачу контекста.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.