1

使用GraphQL.NET,我LoginPayload为这样的突变定义了一个不可为空的返回类型(例如):

type MyMutation {
  login(input: LoginInput!): LoginPayload!
}

在 C# 中,它看起来像这样:

    FieldAsync<NonNullGraphType<LoginPayloadType>>(
        "login",
        arguments: new QueryArguments(
            new QueryArgument<NonNullGraphType<LoginInputType>> { Name = "input" }),
        resolve: async context =>
        {
            //...
        });

基于此架构定义,客户端期望响应数据永远不会为空。但是,如果在解析器中抛出异常,GraphQL.NET 会这样响应:

{
  "data": {
    "login": null
  },
  "errors": [
    {
      "message": "GraphQL.ExecutionError: some exception thrown",
      ...
    }
  ]
}

当出现错误时,如何配置 GraphQL.Net 以排除该data属性,使其看起来像这样?

{
  "errors": [
    {
      "message": "GraphQL.ExecutionError: some exception thrown",
      ...
    }
  ]
}
4

2 回答 2

1

如果这是您实际看到的行为,那么这是一个错误,因为根据规范这不应该发生。

由于 Non-Null 类型的字段不能为 null,因此字段错误被传播以由父字段处理。如果父字段可能为null,则解析为null,否则如果是Non-Null类型,则字段错误会进一步传播到其父字段...如果从请求的根到源的所有字段字段错误返回非空类型,则响应中的“数据”条目应为空。

于 2020-01-29T16:48:27.913 回答
0

此问题已在 GraphQL.NET 3.5 预发行版中得到修复。

示例 1:NonNullGraphType

查询字段:

    Field<NonNullGraphType<WidgetType>>(
        "exception",
        resolve: context =>
        {
            throw new ExecutionError("Something went wrong!");
        }
    );

版本 3.4 响应:

{
  "data": {
    "exception": null
  },
  "errors": [
    {
      "message": "Something went wrong!",
      ...
    }
  ]
}

版本 3.5 响应:

{
  "errors": [
    {
      "message": "Something went wrong!",
      ...
    }
  ],
  "extensions": {
     ...
  }
}

示例 2:可为空

查询字段:

    Field<WidgetType>(
        "exceptionAndNullable",
        resolve: context =>
        {
            throw new ExecutionError("Something went wrong!");
        }
    );

版本 3.4 响应:

{
  "data": {
    "exceptionAndNullable": null
  },
  "errors": [
    {
      "message": "Something went wrong!",
      "...
    }
  ]
}

版本 3.5 响应:

{
  "data": {
    "exceptionAndNullable": null
  },
  "errors": [
    {
      "message": "Something went wrong!",
      ...
  ],
  "extensions": {
    ...
  }
}

请注意,示例 1data中的 3.5 版本不再返回,而在示例 2 中,版本之间的响应基本没有变化。

于 2020-01-30T17:42:08.333 回答