Аудит в Express.js Промежуточное программное обеспечение

#node.js #express #middleware #audit #audit-logging

#node.js #экспресс #промежуточное программное обеспечение #аудит #аудит-ведение журнала

Вопрос:

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

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

  • Для этого я могу довольно легко использовать библиотеку «протоколирования», такую как bunyan, в маршрутизации API. Но это означает, что я должен вызывать функцию ведения журнала везде, где я хочу провести аудит.
  • Используйте центральную функцию, такую как приведенная в фрагменте, для ведения журнала. Это хороший способ регистрации запроса / ответа API, но не помогает, когда дело доходит до аудита важной информации, такой как аудит идентификатора пользователя при регистрации пользователя. Или аудит адреса электронной почты при входе пользователя в систему.

     function auditUserAction(apiFunction) {
    
        function jsonWrapper(funcToWrap, userAction) {
            return function() {
                userAction.jsonResponse = arguments[0];
                return funcToWrap.apply(this, arguments);
            }
        }
    
        return function() {
            req = arguments[0];
            res = arguments[1];
    
            // Overriding json method so we can capture the json response
            res.json = jsonWrapper(res.json, userAction);
            userAction.url = req.url;
            userAction.userId =  req.headers.user_id;
            userAction.referer = req.headers.referer;
            userAction.browserAgent = req.headers['user-agent'];
            result = apiFunction.apply(this, arguments);
            userAction.responseStatusCode = res.statusCode;
            userAction.responseBody = res.body;
            logger.info("Action", userAction);
            return resu<
        }
    }
    ..........
    router = require('express').Router();
    router.post('/users', auditUserAction(createUser));
      

Есть ли лучшая стратегия, чем эта? Я искал в Интернете, но не смог найти ни одного способа сделать это элегантно.