GraphQL. Net - исключить нулевые данные при исключении мутации - PullRequest
1 голос
/ 29 января 2020

Используя 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",
      ...
    }
  ]
}

Ответы [ 2 ]

1 голос
/ 29 января 2020

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

Поскольку Поля нулевого типа не могут быть нулевыми, ошибки полей распространяются для обработки родительским полем. Если родительское поле может быть нулевым, тогда оно разрешается до нуля, в противном случае, если оно не является нулевым типом, ошибка поля далее распространяется на его родительское поле ... Если все поля от root запроса к источнику из поля error возвращают ненулевые типы, тогда запись «data» в ответе должна быть нулевой.

0 голосов
/ 30 января 2020

Эта проблема была исправлена ​​в GraphQL. * Предварительный выпуск NET.

Пример 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: Nullable

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

    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, ответ в значительной степени неизменен между версиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...