【问题标题】:Why is graphql-dotnet returning "Expected non-null value" error for this schema?为什么 graphql-dotnet 会为此架构返回“预期的非空值”错误?
【发布时间】:2019-05-15 09:02:57
【问题描述】:

我有一个简单的模式,我试图查询如下:

{
  subQuery {
    subObjectGraph {
      Name
    }
  }
}

但是“graphiql”会引发以下错误,甚至似乎都没有运行我的查询。

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

我的架构有什么问题(如下)?我正在新建一个子对象,所以我不明白为什么错误消息暗示该值为空。

    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);
        }
    }

如果我用 StringGraphType 替换 MySubObjectGraphType 代码可以正常工作,所以问题一定出在 MySubObjectGraphType 的配置上。

请帮忙?我正在使用 v2.4。

【问题讨论】:

    标签: c# graphql graphql-dotnet


    【解决方案1】:

    您需要在Startup.cs 中为MySubObjectGraphType 添加服务注册

    因此该规则可以描述为“从ObjectGraphType 派生的自定义类型必须在某个时候通过依赖注入进行注册”

    例如Startup.cs

    services.AddSingleton<MySubObjectGraphType>();

    【讨论】:

      【解决方案2】:

      您在 RootQuery 的 subQuery 中返回一个 GraphType。解析器应该只返回 DTO,而不应该返回 GraphTypes。

      如果您尝试组织查询,则只需返回一个空对象。

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

      https://graphql-dotnet.github.io/docs/getting-started/query-organization

      【讨论】:

      • 感谢乔,感谢您提供了一个很棒的图书馆!我尝试按照您的建议进行更改,但仍然遇到完全相同的问题。看起来 MySubObjectGraphType 有问题,但我不知道是什么问题。 “FetchFromRepo”方法返回一个 Dto,所以我想它应该映射到 graphType 没有问题?这里稍微更新了要点:gist.github.com/willemodendaal/77ff0feded77a33238e43142c7a00f3f
      • 顺便说一下我用的是v2.4。
      猜你喜欢
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 2012-06-14
      • 2016-03-29
      • 2021-03-09
      • 1970-01-01
      • 2010-10-30
      相关资源
      最近更新 更多