使用 express 记录所有 GraphQL 响应

Posted

技术标签:

【中文标题】使用 express 记录所有 GraphQL 响应【英文标题】:Log all GraphQL responses with express 【发布时间】:2017-04-29 18:36:50 【问题描述】:

我设法设置日志记录 graphQL 错误:

app.use('/graphql', graphqlHTTP(request => 
  return 
    schema,
    rootValue: 
      request
    ,
    formatError: error => 
      const params = 
        message  : error.message,
        locations: error.locations,
        stack    : error.stack
      ;
      winston.error(`message: "$error.message", QUERY: "$request.body.query"`);
      // Optional $request.body.operationName $request.body.variables
      return (params);
    
  
));

如何设置一个通用函数,即使没有错误也可以访问请求和响应?

编辑:我已设法通过以下方式记录所有请求:

function loggingMiddleware(req, res, next) 
  if (req.url.startsWith('/graphql')) 
    winston.debug('REQUEST: ', req.body);
  
  next();

app.use(loggingMiddleware);

在我打电话给app.use('/graphql') 之前,但仍然不知道如何运行“post graphql 处理”处理程序来记录响应。

【问题讨论】:

感谢您发布有关您如何管理日志记录的信息。我发现req.body 在当前版本的express-graphql 中未定义(0.9.0)。 【参考方案1】:

您可以在express中代理req.send()函数。

app.use(function (req, res, next) 
    let originalSend = res.send;
    res.send = function (data) 
        console.log(data);
        originalSend.apply(res, Array.from(arguments));
    
    next();
)

这只是为了向您展示如何实现这样的目标。

我看到你使用winston,所以我建议你使用express-winston。

另外,请检查this。

【讨论】:

【参考方案2】:

我正在使用这个包来实现你想要的: https://github.com/withspectrum/graphql-log

我还使用了debug,并添加了一个日期作为日志的前缀,这是一个示例代码:

if (process.env.NODE_ENV === 'development') 
    const createGraphQLLogger = require('graphql-log');
    const debug = require('debug')('server:resolvers');
    debug.enabled = true;
    const logExecutions = createGraphQLLogger(
        prefix: new Date(),
        logger: debug
    )
    logExecutions(resolvers);

【讨论】:

【参考方案3】:

这很简单。 express-graphql 提供了一种extensions 机制,它直接为您提供result 作为参数之一。

app.use('/graphql', graphQLHTTP(request => 
  return 
    schema: ...,
    extensions(
      result,
    ) 
      console.log(result.data);
    ,
  ;
));

【讨论】:

以上是关于使用 express 记录所有 GraphQL 响应的主要内容,如果未能解决你的问题,请参考以下文章

javascript 示例应用程序将使用Apache格式将所有请求记录到文件,但错误响应将记录到控制台

从 Rest(Express) 迁移到 GraphQL:模型(mongoose) 在 graphQL 解析器中不起作用

使用 Express-GraphQL 的 GraphQL 订阅

Graphql 突变查询不适用于 express-graphql

Express GraphQL TTFB 非常长

使用 express-graphql 和 HTTP 客户端从 graphql 获取数据