Jon*_*han 2 typescript apollo graphql apollo-server
我很惊讶我找不到一个库或示例来执行以下操作:
我想要对服务器的每个请求的简单服务器日志,该日志将说明请求的查询或更改,以及完成请求所用的时间
我知道有插件和扩展框架。但我不确定在两个回调之间保持状态的最佳做法是什么:requestDidStart和willSendResponse
会吐出的东西:
path="createAccountMutation" service=20ms
Run Code Online (Sandbox Code Playgroud)
额外的功劳是显示有效载荷的大小
path="createAccountMutation" service=20ms bytes=355
Run Code Online (Sandbox Code Playgroud)
很想在打字稿中看到解决方案
注意:我找到了apollo-log——但它不做请求持续时间
谢谢!
requestDidStart 每个请求调用一次并返回请求生命周期钩子的映射,因此您可以初始化钩子之间持久存在的任何状态。
const LogPlugin = {
requestDidStart(requestContext) {
const start = Date.now()
let op
return {
didResolveOperation (context) {
op = context.operationName
},
willSendResponse (context) {
const stop = Date.now()
const elapsed = stop - start
const size = JSON.stringify(context.response).length * 2
console.log(
`Operation ${op} completed in ${elapsed} ms and returned ${size} bytes`
)
}
}
},
}
Run Code Online (Sandbox Code Playgroud)
请注意,这仅适用于每个请求。如果您需要更细粒度的东西,例如跟踪单个字段需要多长时间来解析,则需要使用指令或中间件
这是打字稿中的
import {
ApolloServerPlugin,
} from 'apollo-server-plugin-base';
import { GraphQLRequestContext } from 'apollo-server-types';
import { GraphQLRequestListener } from 'apollo-server-plugin-base/src/index'
// /sf/ask/4199223451/
export const LogPlugin: ApolloServerPlugin = {
requestDidStart<TContext>(_: GraphQLRequestContext<TContext>): GraphQLRequestListener<TContext> {
const start = Date.now()
let op: string
return {
didResolveOperation (context) {
op = context.operationName
},
willSendResponse (context) {
const stop = Date.now()
const elapsed = stop - start
const size = JSON.stringify(context.response).length * 2
console.log(
`operataion=${op} duration=${elapsed}ms bytes=${size}`
)
}
}
},
}
Run Code Online (Sandbox Code Playgroud)
所有功劳都归功于丹尼尔·里尔登
| 归档时间: |
|
| 查看次数: |
2385 次 |
| 最近记录: |