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

时间:2019-05-11 07:47:23

标签: node.js graphql apollo-server

我们正在将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服务器以不将错误列表包装在错误对象中。

1 个答案:

答案 0 :(得分:1)

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