如何使用拦截器在nest.js中访问最终的GraphQL-Response

时间:2019-07-08 09:47:19

标签: node.js graphql nestjs

我已经实现了LoggingInterceptor,它应该能够访问最终的GraphQL-Response及其数据和错误属性+原始请求正文和已验证的用户,{{ (编辑:部分由@ jay-mcdoniel解决:AuthGuarduser可通过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());

2 个答案:

答案 0 :(得分:3)

拦截器实际上是在响应之前和之后调用的,或者至少应在响应之后调用,以便您可以拥有请求前逻辑(请求输入)和请求后逻辑(响应输出)。在调用next.hanlde()之前,您应该能够完成所有的请求前处理,然后在{{之后,可以使用RxJS Observable operatorstap之类的map 1}}呼叫。您的pipe()变量应具有请求/响应中的所有信息,甚至可以使用allData变量来获取更多信息。

context当前为您打印什么?您是否尝试过allDataGqlExecutionContext.create(context).getContext().reqGqlExecutionContext.create(context).getContext().res文档中显示了它们的使用方式,以获取请求和响应对象,就像普通的HTTP调用一样。

答案 1 :(得分:0)

这就是我在我的日志拦截器中做到的

-j2