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