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


Если вы используете 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. Вы можете взглянуть на репо для получения дополнительной информации.
Регистрация ответа на самом деле очень проста с расширения экспресс-графа. Однако я не мог понять, как зарегистрируйте запрос.