express-server-with-async-context

В данном проекта реализован тестовый сервер с кастомной системой "сквозного" логирования (трассировка запросов).
К обычному express серверу был добавлен асинхронный контекст. Это дает возможность содержать в нем информацию, которая нужна только в рамках одного уникального запроса.

Это можно очень удобно использовать, например, для логирования, в любой точке кода во время выполняемого запроса мы можем получить данные из контекста без "пробрасывания" данных по функциям и не модифицируя объект запроса ( req ).


Как засетапить на другом проекте

Нужно скопировать:

./src/services/context - полностью сервис
./src/utils/loggerService - полностью сервис
./src/middlewares{ init-async-context-middleware.js, logger-middleware.js }

После чего, в мидлварках нужно подкорректировать путь до сервиса для работы с контекстами, конфиг файлу и к логеру.
Также в логер сервисе в файле logger.js нужно обновить путь к сервису по работе с контекстом и к конфиг файлу.

Ниже приведено описание ключевых файлов логера и сервиса по работе с контекстом.


Краткое описание файлов

src/services/context

Сервис по работе с контекстом приложения, это обертка над библиотекой cls-hooked, для удобной работы с парметрами и контектсами.

context.service.js

Содержит в себе базовые, общие методы и свойства для контекстов т.к. в теории можно создать несколько разных контекстов в одном приложении в течении одного уникального запроса.

app-context.service.jsв

Содержит в себе методы, свойства для удобной работы с конкретным контекстом, в данном случае контекст app.

src/services/context/structures

Cодержит в себе структуру, описание какие параметры существуют в контексте, хеддеры для трассировки при логировании. Очень удобно если хедер поменялся, то нужно только поменять его здесь в структуре контекста и все будет работать корректно.

structures/app-context.js

В этом файле описана структура контекста app. Если нужно добавить новый параметр в контекст, то нужно добавить его в структуру затем только использовать.

src/middlewares

Здесь содержится 2 файла, которые достойны внимания(описаны ниже), остальные мидлварки стандартные, здесь скудно реализованы, только для возможности протестировать, как это работает в действительности.

init-async-context.middleware.js

Мидлварка, которая создает главный контекст приложения и записывает в него данные для трассировки запросов т.е. считывает нужные хедеры из входящего запроса и сохраняет их в контекст, если хедеры не были найдены, то генерирует свой traceID с префиксом названия приложения, чтобы не потерять группу логов.

loggerMiddleware.js

Содержит мидлварки для логирования входящих запросов, а также вносит правку в метод res.send() для того, чтобы можно было залогировать тело response.body т.к. в базе express отсутствует такая возможность. Логирование сработает в тот момент, когда сервер отправит ответ клиенту. Также высчитывается время выполнения запроса и передается в логирование.

/src/utils/loggerService

Cодержит в себе базовый логер и http логер.

logger.js

Логер, обертка над winston, при должном желании можно поменять на любой другой логер с минимальными изменениями. Также в этом классе содержится метод для форматирования тела лога и здесь подключен сервис для получения параметров из контекста.

http-logger.js

Кастомный http логер, просто наследует главный класс логера и переопределяет некоторые методы, для передачи нужных параметров для формирования http лога.