如何避免在错误响应中将错误集合包装在 Apollo Server V2 中的错误对象中

Posted

技术标签:

【中文标题】如何避免在错误响应中将错误集合包装在 Apollo Server V2 中的错误对象中【英文标题】:How to avoid wrapping errors collection in a error object in Apollo Server V2 in error response 【发布时间】:2019-09-28 23:52:43 【问题描述】:

我们正在将 Apollo Graphql Server v1 项目迁移到 v2。

我们注意到错误响应格式发生了变化。

在 v2 中,响应中的错误列表包含在错误对象中。

但是,在 v1 中,情况并非如此。我们希望有一个一致的标准,而不是在 v2 中引入包装行为。

我了解 GraphQL 服务可能会按照以下链接通过扩展提供额外的字段。 链接:https://graphql.github.io/graphql-spec/June2018/#sec-Errors

我已经测试了 Apollo GraphQL V2,这就是它在那里的实现方式。

在 v1 中符合预期。

在 v1 中,我们看到如下错误响应,



  "errors": [
    
      "message": "Field \"announcement\" must not have a selection since type \"String\" has no subfields.",
      "locations": [
        
          "line": 2,
          "column": 16
        
      ]
    
  ]

在 v2 中,我们看到如下错误响应,


  "error": 
    "errors": [
      
        "message": "Field \"announcement\" must not have a selection since type \"String\" has no subfields.",
        "locations": [
          
            "line": 2,
            "column": 16
          
        ],
        "extensions": 
          "code": "GRAPHQL_VALIDATION_FAILED",
          "exception": 
            "stacktrace": [
             ...
            ]
          
        
      
    ]
  


在 v1 错误响应中,错误列表不包含在错误对象中。在 v2 中,它被包裹在错误对象中。

但是,我的问题是为什么 错误列表 在 v2 中包含在 错误对象 中。 在 v1 中,响应中只有错误列表。

我们遵循所有服务(REST 和非 REST)的标准以具有标准格式,并且与 v1 版本一致。但是,现在我们看到它被包裹在一个错误对象中。

我们有什么方法可以配置 Apollo Server 不将错误列表包装在错误对象中。

【问题讨论】:

【参考方案1】:

此行为在版本 2 中没有改变。Apollo Server 生成符合规范的响应,并且不会将任何产生的错误包装在 error 对象中。相反,这只是带有 GraphQL Playground 的 a known bug。在 2.0 版中,Apollo Server 从 GraphiQL 过渡到 GraphQL Playground。 GraphiQL 没有同样的问题,这就是为什么这看起来像是 Apollo Server 的错误。检查网络选项卡并查看服务器的实际响应——它实际上是预期的格式。

【讨论】:

是的。我得到了它。这是 GraphQL Playground 的错误,而不是 Apollo GraphQL v2 的错误。你是对的。

以上是关于如何避免在错误响应中将错误集合包装在 Apollo Server V2 中的错误对象中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Apollo 中将一张表关联到另一张表

Apollo 客户端错误:在上下文中找不到“客户端”或作为选项传入。将根组件包装在 <ApolloProvider> 中

如何从 Apollo 客户端的 useQuery 获取响应头

React Apollo 错误:查询不再有模拟响应:突变

Apollo GraphQL 错误处理

所有 apollo 查询错误都会引发网络 400 错误