Регистрировать действия запроса/мутации в базе данных для аудита

Моя цель — запустить какой-то веб-хук, облачную функцию или сказать, что я хочу выполнить какое-то действие после каждого успешного запроса или успешной мутации в graphql. Означает, что я хочу регистрировать каждое действие, выполняемое пользователями (вид истории того, когда что было создано и обновлено). Как это можно реализовать с помощью какого-то промежуточного программного обеспечения между graphql и БД (скажем, сейчас mongo)? Означает, что промежуточное ПО должно нести ответственность за запуск действия регистрации каждый раз, когда запрос или мутация вызывается из внешнего интерфейса.

Используемый стек технологий: Node, Express, graphQl, Redis и т. д.

Любые предложения будут действительно оценены. Спасибо

Решение, которое я придумал, заключалось в вызове функции вручную каждый раз при запросе или изменении.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
3
0
1 258
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы используете Apollo, вы можете использовать параметры formatResponse и formatError для ведения журнала, как указано в документы.

const server = new ApolloServer({
  typeDefs,
  resolvers,
  formatError: error => {
    console.info(error);
    return error;
  },
  formatResponse: response => {
    console.info(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)
    }
  }
}

Есть более сложный пример здесь. Затем вы можете добавить свое расширение следующим образом:

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

Если вы используете express-graphql для обслуживания своей конечной точки, ваши возможности немного более ограничены. Еще есть вариант formatError, но нет formatResponse. Существует также способ передать массив расширений, но API отличается от API Apollo. Вы можете взглянуть на репо для получения дополнительной информации.

Регистрация ответа на самом деле очень проста с расширения экспресс-графа. Однако я не мог понять, как зарегистрируйте запрос.

Dan Dascalescu 14.04.2020 10:07

Другие вопросы по теме