Javascript 发送前修改Graphql的响应

Javascript 发送前修改Graphql的响应,javascript,graphql,apollo-server,Javascript,Graphql,Apollo Server,我正在寻找一种在graphql查询或变异发出之前修改其响应对象的方法 基本上除了数据对象之外,我还希望有额外的字段,比如代码和消息 目前,我正在通过将字段直接添加到我的GQL模式来解决这个问题,例如,以下类型定义: type Query { myItems: myItemResponse } type myItemResponse { myItem: Item code: String! success: Boolean! message: String! } 回答本身应

我正在寻找一种在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>
      }
   }
}

不幸的是,这并没有达到预期的效果。在使用express Middleware之前,我想问一下是否有可能通过apollo server开箱即用,或者我可能只是缺少formatResponse函数中的某些内容。

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

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

对GraphQL操作的响应必须是映射

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

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

响应映射还可能包含一个带有键扩展名的条目。如果设置了此条目,则其值必须为map。这个条目是为实现者保留的,他们可以根据自己的意愿扩展协议,因此对其内容没有额外的限制


为确保将来对协议的更改不会破坏现有服务器和客户端,顶级响应映射不得包含除上述三个项以外的任何项。
formatResponse
是添加这些字段的正确方法。说“没有达到预期效果”并不能描述你的问题。请指定您期望的行为以及遇到的意外行为。我的意思是,即使我返回{data,test}我只在响应中返回数据,但预期的行为是响应包含{data,test}GraphQL,甚至在每个字段级别上,这些错误可以携带扩展值,比如人类可读的消息和机器可读的代码。阿波罗也有一些可能满足你的需要。@Matt看看这个<代码>格式响应按预期工作。如果前端的客户机没有公开这些信息,那是另一个问题。您可以通过打开“网络”选项卡并查看从服务器收到的实际响应来验证是否存在这种情况。如果确实发生了这种情况,则可能应该将此问题改写为“为什么[客户端]不读取我在响应中设置的自定义属性?”
{
   data: {
      myItems: [ ... fancy Items ... ],
   },
   message: 'successfully retrieved fancy Items',
   code: <CODE_FOR_SUCCESSFUL_QUERY>
}
const server = new ApolloServer({
   ...
   formatResponse({ data }) {
     return {
        data,
        test: 'Property to test if shown in the FrontEnd',
     }
   }
   ...
}