Почему graphql-dotnet возвращает ошибку "Ожидаемое ненулевое значение" для этой схемы? - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть простая схема, которую я пытаюсь запросить следующим образом:

{
  subQuery {
    subObjectGraph {
      Name
    }
  }
}

Но "graphiql" выдает следующую ошибку, даже не пытаясь выполнить мой запрос.

{
  "errors": [
    {
      "message": "Expected non-null value, resolve delegate return null for \"$Api.Schema.Queries.MySubObjectGraphType\"",
      "extensions": {
        "code": "INVALID_OPERATION"
      }
    }
  ]
}

Что не так с моей схемой (ниже)?Я заново создаю SubObject, поэтому не понимаю, почему в сообщении об ошибке указано, что значение равно null.

    public class Schema: GraphQL.Types.Schema
    {
        public Schema(IDependencyResolver resolver): base(resolver)
        {
            Query = resolver.Resolve<RootQuery>();  
            Mutation = null;
        }
    }

    public class RootQuery: ObjectGraphType
    {
        public RootQuery(IDependencyResolver resolver)
        {
            Name = "Query";

            Field<MySubQuery>(
                name: "subQuery",
                resolve: ctx => resolver.Resolve<MySubQuery>());
        }
    }


    public class MySubQuery: ObjectGraphType
    {
        public MySubQuery()
        {
            Name = "TempSubQuery";

            Field<StringGraphType>("SubQueryName", resolve: ctx => "Some string value");

            Field<MySubObjectGraphType>(
                name: "subObjectGraph",
                resolve: ctx => FetchFromRepo());
        }


        //Repo access would go here, but just new-ing the object for now.
        private SubObject FetchFromRepo()
        {
            return new SubObject() { Name = "some sub object" };
        }
    }


    public class SubObject
    {
        public string Name { get; set; }
    }

    public class MySubObjectGraphType: ObjectGraphType<SubObject>
    {
        public MySubObjectGraphType()
        {
            Name = "MySubObject";
            Description = "An object with leaf nodes";

            Field(l => l.Name);
        }
    }

Код работает нормально, если я заменяю MySubObjectGraphType на StringGraphType, поэтому проблема должна бытьс конфигурацией MySubObjectGraphType.

Пожалуйста, помогите?Я использую v2.4.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Вам необходимо добавить регистрацию службы для MySubObjectGraphType в вашем Startup.cs

Таким образом, правило можно описать так: «пользовательские типы, производные от ObjectGraphType, должны быть зарегистрированы с помощью внедрения зависимостей в некоторый момент"

например, в Startup.cs:

services.AddSingleton<MySubObjectGraphType>();

0 голосов
/ 14 декабря 2018

Вы возвращаете GraphType в subQuery в вашем RootQuery.Решатели должны возвращать только DTO и никогда не использовать GraphTypes.

Если вы пытаетесь организовать свои запросы, просто верните пустой объект.

Field<MySubQuery>(
  name: "subQuery",
  resolve: ctx => new {});

https://graphql -dotnet.github.io / документы / получение стартером / запросы организация

...