使用 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 订阅