GraphQL.Net - предотвращение нулевых данных при исключении мутации

Используя GraphQL.NET, я определил возвращаемый тип, не допускающий значения NULL (например,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",
      ...
    }
  ]
}

2 ответа

Решение

Если вы действительно наблюдаете такое поведение, то это ошибка, поскольку это не то, что должно происходить согласно спецификации.

Поскольку поля типа, отличного от Null, не могут иметь значение NULL, ошибки поля распространяются для обработки родительским полем. Если родительское поле может иметь значение NULL, тогда оно разрешается в значение NULL, в противном случае, если это тип Non-Null, ошибка поля в дальнейшем распространяется на его родительское поле... Если все поля от корня запроса до источника field error return Типы, отличные от Null, тогда запись "data" в ответе должна быть нулевой.

Эта проблема была исправлена ​​в предварительной версии 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: допускающий значение NULL

Поле запроса:

    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": {
    ...
  }
}

Обратите внимание на пример 1, data больше не возвращается в версии 3.5, тогда как в Примере 2 ответ в значительной степени не изменился между версиями.

Другие вопросы по тегам