You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AngularJS模块中触发Node.js审计日志功能?

解决方案:无需重写审计逻辑,在AngularJS中触发Node.js审计功能

你完全不需要在AngularJS里重写整个审计逻辑——我们可以复用现有Node.js的审计代码,通过前端主动调用一个新增的后端审计接口来实现导出操作的日志记录。下面是具体的实现步骤:

步骤1:调整Node.js审计模块,暴露复用的核心逻辑

首先,我们需要把现有审计代码里的auditItems函数单独暴露出来,这样新增的接口可以直接复用它,不用重复编写日志发送逻辑。修改你的审计模块代码:

const mung = require('express-mung');
var express = require('express');

module.exports = function(apper) {
  // 核心审计逻辑,单独定义以便复用
  function auditItems(res, status, identity, body) {
    try {
      let method = res.locals.method;
      let action = 'log';
      let items = buildItems(res, body);
      let payload = apper.events.items.build(action, items, opts);
      // 复用现有的日志发送逻辑
      apper.events.items.send(payload).then(handleSuccess).catch(handleError);
    } catch(e) {
      handleError(e);
    }
  }

  function audit(body, req, res) {
    let status = res.statusCode;
    let identity = 'thisapp';
    auditItems(res, status, identity, body);
  }

  // 创建中间件,并把auditItems挂载到中间件对象上,方便外部调用
  const auditMiddleware = mung.json(audit, {mungError:true});
  auditMiddleware.auditItems = auditItems;
  return auditMiddleware;
}

步骤2:新增Node.js审计接口

在你的server.js里,添加一个专门接收前端审计请求的接口,直接调用刚才暴露的auditItems函数:

const auditlocal = require('./lib/my_audit');
const auditMiddleware = auditlocal(apper);
app.use(auditMiddleware);

// 新增审计接口,用于接收前端主动发起的日志请求
app.post('/api/audit', (req, res) => {
  try {
    // 设置请求方法,匹配现有审计逻辑的参数要求
    res.locals.method = req.method;
    // 从前端请求体获取审计信息(可以根据需求扩展字段)
    const { items, identity = 'thisapp' } = req.body;
    // 调用核心审计逻辑
    auditMiddleware.auditItems(res, 200, identity, items);
    res.status(200).json({ success: true });
  } catch (err) {
    console.error('审计日志记录失败:', err);
    res.status(500).json({ success: false, error: '日志记录失败' });
  }
});

步骤3:在AngularJS中封装审计服务

创建一个AngularJS服务,专门用来调用上面的审计接口,方便在控制器里复用:

angular.module('App.Reports').factory('AuditService', ['$http', function($http) {
  return {
    // 封装导出操作的日志记录方法
    logExport: function(exportInfo) {
      return $http.post('/api/audit', {
        items: {
          operation: 'Excel导出',
          reportName: exportInfo.reportName || '未知报表',
          timestamp: new Date().toISOString(),
          // 可以添加更多字段,比如当前用户ID、导出内容的维度等
          ...exportInfo
        },
        identity: 'thisapp'
      });
    }
  };
}]);

步骤4:在导出控制器中触发审计

修改你的导出控制器,注入AuditService,并在用户点击导出按钮时调用日志记录方法:

angular.module('App.Reports').register('MyCtrl',['$scope', 'LocalService', 'LocalReportService', 'AuditService', function($scope, LocalService, ReportService, AuditService) {
  $scope.export = function() {
    var csvContent= "Building, Grounds, Year1, Year2";
    var dataString = "";
    // 执行导出操作
    ReportService.getCsvExport(csvContent);
    
    // 触发审计日志,传递导出的上下文信息
    AuditService.logExport({
      reportName: '我的自定义报表' // 根据实际场景传递具体信息
    }).then(function() {
      console.log('导出操作日志已记录');
    }).catch(function(error) {
      console.error('日志记录失败:', error);
      // 注意:这里建议不要阻断导出操作,即使日志记录失败,用户依然可以正常导出
    });
  };
}]);

为什么这种方式可行?

  • 完全复用现有审计逻辑:我们没有重写任何日志发送、构建payload的代码,只是新增了一个入口让前端可以触发它。
  • 灵活适配前端操作:对于导出这种前端本地生成内容的操作,前端主动调用审计接口是最直接的方式。
  • 可扩展性强:你可以根据需求在审计请求里添加更多上下文信息(比如用户ID、导出的报表参数等),让审计日志更完整。

内容的提问来源于stack exchange,提问作者Blake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 16:37:49