Graphql 将查询/变异操作记录到数据库以进行审核

Graphql 将查询/变异操作记录到数据库以进行审核,graphql,graphql-js,Graphql,Graphql Js,我的目标是在graphql中的每次查询成功或变异成功后运行某种webhook、云函数或说我想执行某种操作。 意味着我想记录用户执行的每个操作(创建和更新的历史记录)。 如何使用graphql和DB之间的某种中间件实现这一点(比如现在的mongo)? 这意味着中间件应该负责在每次从前端调用查询或变异时运行日志记录操作 使用的技术堆栈是-节点、express、graphQl、Redis等 任何建议都将不胜感激。 谢谢 我提出的解决方案是每次查询或变异时手动调用函数。如果您使用Apollo,您可以使用

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

使用的技术堆栈是-节点、express、graphQl、Redis等

任何建议都将不胜感激。 谢谢


我提出的解决方案是每次查询或变异时手动调用函数。

如果您使用Apollo,您可以使用
formatResponse
formatError
选项进行日志记录,如中所述

使用扩展可以让您连接到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)
    }
  }
}
有一个更复杂的例子。然后,您可以像这样添加扩展:

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

如果您使用
expressgraphql
为端点服务,那么您的选项就有点有限。仍然有一个
formatError
选项,但没有
formatResponse
。还有一种方法可以传递扩展数组,但API与Apollo不同。您可以查看以了解更多信息。

记录响应实际上非常简单。但我不知道该怎么做。
const server = new ApolloServer({
  typeDefs,
  resolvers,
  extensions: [() => new YourExtension()]
});