将查询/更改操作记录到数据库以进行审核

时间:2019-02-28 21:55:54

标签: graphql graphql-js

我的目标是运行某种Webhook,云功能,或者说我想在graphql中的每次查询成功或突变成功之后执行某种操作。 意味着我想记录用户执行的每项操作(创建和更新内容的历史记录)。 如何在graphql和DB之间使用某种中间件(现在说mongo)来实现? 意味着每次从前端调用查询或变异时,中间件都应负责运行日志记录操作。

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

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

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

1 个答案:

答案 0 :(得分:1)

如果您使用的是Apollo,则可以使用docs中概述的formatResponseformatError选项进行记录。

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了解更多信息。