将 Query/Mutation 操作记录到数据库以供审计

Log Query/Mutation actions to database for Auditing

我的目标是 运行 某种网络钩子​​、云函数,或者说我想在 graphql 中每次查询成功或突变成功后执行某种操作。 意味着我想记录用户执行的每个操作(创建和更新时间的历史记录)。 如何使用 graphql 和 DB 之间的某种中间件来实现这一点(现在说 mongo)? 意味着每次从前端调用查询或变更时,中间件都应负责 运行 日志记录操作。

正在使用的技术堆栈是 - Node、express、graphQl、Redis 等

如有任何建议,我们将不胜感激。 谢谢

我想出的解决方案是每次查询或更改时手动调用一个函数。

如果您使用的是 Apollo,则可以使用 formatResponseformatError 选项进行日志记录,如 docs.

中所述
const server = new ApolloServer({
  typeDefs,
  resolvers,
  formatError: error => {
    console.log(error);
    return error;
  },
  formatResponse: response => {
    console.log(response);
    return response;
  },
});

使用扩展可以让您挂接到 GraphQL 请求的不同阶段,并允许更精细的日志记录。一个简单的例子:

const _ = require('lodash')
const { GraphQLExtension } = require('graphql-extensions')

module.exports = class LoggingExtension extends GraphQLExtension {
  requestDidStart(options) {
    logger.info('Operation: ' + options.operationName)
  }

  willSendResponse(o) {
    const errors = _.get(o, 'graphqlResponse.errors', [])
    for (const error of errors) {
      logger.error(error)
    }
  }
}

还有一个更复杂的例子 here。然后你可以像这样添加你的扩展:

const server = new ApolloServer({
  typeDefs,
  resolvers,
  extensions: [() => new YourExtension()]
});

如果您使用 express-graphql 来为您的端点提供服务,您的选择会更加有限。仍然有 formatError 选项,但没有 formatResponse。也有一种方法可以传入扩展数组,但 API 与 Apollo 的不同。您可以查看 repo 了解更多信息。