发送前修改Graphql的响应

时间:2019-05-10 09:52:44

标签: javascript graphql apollo-server

我正在寻找一种在发送出去之前修改graphql查询或变异的响应对象的方法。

基本上除了数据对象外,我还希望有其他字段,例如代码和消息。

目前,我正在通过将字段直接添加到我的GQL模式中来解决此问题,例如以这种类型定义为例:

type Query {
  myItems: myItemResponse
}

type myItemResponse {
  myItem: Item
  code: String!
  success: Boolean!
  message: String!
}

响应本身如下所示:

{
   data: {
      myItems: {
         myItem: [ ... fancy Items ... ],
         message: 'successfully retrieved fancy Items',
         code: <CODE_FOR_SUCCESSFUL_QUERY>
      }
   }
}

我发现该解决方案不好,因为它会使FrontEnd中的事情变得过于复杂。

我希望将消息代码和其他元数据与实际数据分开的解决方案,如下所示:

{
   data: {
      myItems: [ ... fancy Items ... ],
   },
   message: 'successfully retrieved fancy Items',
   code: <CODE_FOR_SUCCESSFUL_QUERY>
}

使用apollo服务器,我已经在构造函数中尝试过formatResponse对象:

const server = new ApolloServer({
   ...
   formatResponse({ data }) {
     return {
        data,
        test: 'Property to test if shown in the FrontEnd',
     }
   }
   ...
}

不幸的是,这并没有达到预期的效果。在我使用快速中间件之前,我想问一下是否有可能通过apollo服务器开箱即用,或者我是否只是在formatResponse函数中缺少某些东西。

2 个答案:

答案 0 :(得分:1)

from graphql.org: 对GraphQL操作的响应必须是映射。

如果操作遇到任何错误,则响应映射必须包含带有关键错误的条目。该条目的值在“错误”部分中描述。如果操作完成而没有遇到任何错误,则该条目不得存在。

如果该操作包括执行,则响应映射必须包含带有关键数据的条目。该条目的值在“数据”部分中描述。如果操作由于语法错误,信息丢失或验证错误而在执行前失败,则该条目不得存在。

响应图可能还包含带有键扩展名的条目。如果设置此条目,则其值必须具有映射。此项保留给实施者以扩展协议,但他们认为合适,因此对其内容没有附加限制。

为确保以后对协议进行的更改不会破坏现有的服务器和客户端,顶级响应映射中不得包含上述三个条目以外的任何条目。

答案 1 :(得分:0)

经过大量研究,我发现graphql响应中唯一允许的顶级属性是数据,错误和扩展名。在这里您可以找到有关GitHub的问题

GitHub Issue

出于我的目的,我可能会使用扩展字段。