将 Query/Mutation 操作记录到数据库以供审计
Log Query/Mutation actions to database for Auditing
我的目标是 运行 某种网络钩子、云函数,或者说我想在 graphql 中每次查询成功或突变成功后执行某种操作。
意味着我想记录用户执行的每个操作(创建和更新时间的历史记录)。
如何使用 graphql 和 DB 之间的某种中间件来实现这一点(现在说 mongo)?
意味着每次从前端调用查询或变更时,中间件都应负责 运行 日志记录操作。
正在使用的技术堆栈是 - Node、express、graphQl、Redis 等
如有任何建议,我们将不胜感激。
谢谢
我想出的解决方案是每次查询或更改时手动调用一个函数。
如果您使用的是 Apollo,则可以使用 formatResponse
和 formatError
选项进行日志记录,如 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 了解更多信息。
我的目标是 运行 某种网络钩子、云函数,或者说我想在 graphql 中每次查询成功或突变成功后执行某种操作。 意味着我想记录用户执行的每个操作(创建和更新时间的历史记录)。 如何使用 graphql 和 DB 之间的某种中间件来实现这一点(现在说 mongo)? 意味着每次从前端调用查询或变更时,中间件都应负责 运行 日志记录操作。
正在使用的技术堆栈是 - Node、express、graphQl、Redis 等
如有任何建议,我们将不胜感激。 谢谢
我想出的解决方案是每次查询或更改时手动调用一个函数。
如果您使用的是 Apollo,则可以使用 formatResponse
和 formatError
选项进行日志记录,如 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 了解更多信息。