我已经实现了LoggingInterceptor
,它应该能够访问最终的GraphQL-Response及其数据和错误属性+原始请求正文和已验证的用户,{{ (编辑:部分由@ jay-mcdoniel解决:AuthGuard
和user
可通过body
访问)
实际上,拦截器仅提供了一个完全解析的GraphQL对象。
GqlExecutionContext.create(context).getContext()
这是我的拦截器级。它只是调用RxJS-Operator @Injectable()
export class LoggingInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
return next.handle().pipe(tap(
(allData) => console.log(allData),
(error)=> console.log(error)));
}
}
来记录可观察对象的当前值。
如果我运行以下GraphQL-Request ...
tap
...我的服务器使用以下响应正文正确回答:
mutation {
login(data: { username: "admin", password: "123456" }) {
id
username
token
}
}
但是{
"data": {
"login": {
"id": "6f40be3b-cda9-4e6d-97ce-ced3787e9974",
"username": "admin",
"token": "someToken"
}
}
}
的内容是由我的拦截器记录到控制台的:
allData
相反,我想查看真实响应主体的信息。
我还尝试通过{
id: '6f40be3b-cda9-4e6d-97ce-ced3787e9974',
isAdmin: true,
username: 'admin',
firstname: null,
lastname: null,
email: null,
created: 2019-07-05T15:11:31.606Z,
token: 'someToken'
}
访问HttpResponse。但这仅包含mutation-login-method的参数:
context.switchToHttp().getResponse()
编辑:
{
data: [Object: null prototype] { username: 'admin', password: '123456' }
}
打印(仍然没有GraphQL-ResponseBody):
console.log(GqlExecutionContext.create(context).getContext());
答案 0 :(得分:3)
拦截器实际上是在响应之前和之后调用的,或者至少应在响应之后调用,以便您可以拥有请求前逻辑(请求输入)和请求后逻辑(响应输出)。在调用next.hanlde()
之前,您应该能够完成所有的请求前处理,然后在{{之后,可以使用RxJS Observable operators
或tap
之类的map
1}}呼叫。您的pipe()
变量应具有请求/响应中的所有信息,甚至可以使用allData
变量来获取更多信息。
context
当前为您打印什么?您是否尝试过allData
或GqlExecutionContext.create(context).getContext().req
? GqlExecutionContext.create(context).getContext().res
文档中显示了它们的使用方式,以获取请求和响应对象,就像普通的HTTP调用一样。
答案 1 :(得分:0)
这就是我在我的日志拦截器中做到的
-j2