【问题标题】:graphql-dotnet query by operation namegraphql-dotnet 按操作名称查询
【发布时间】:2019-07-18 22:12:34
【问题描述】:

我正在使用graphql-dotnet 在 Net Core 2.2 Web API 中构建一个 graphql 服务器。

架构说明:

我有一个ObjectGraphType,如下所示

public class UserType
        : ObjectGraphType<Users>
    {
        public UserType()
        {
            Field(x => x.ContactNumber);
            Field(x => x.Email, true);
            Field(x => x.Fax);    
        }
    }
}

我有一个类似的查询定义

public class UserOperationNameQuery
         : ObjectGraphType
    {
        public UserOperationNameQuery()
        {
            Name = "getAllUsers";
            Field<ListGraphType<UserType>>(name: "items", description: "Get all users",
            resolve: context =>
            {
               // resolver
            });
        }

我的架构是

public class GraphQLSchema
        : Schema
    {
        public GraphQLSchema(IDependencyResolver resolver) 
            : base(resolver)
        {            
            Query = resolver.Resolve<UserOperationNameQuery>();
        }
    }

我的控制器方法是:

        [HttpPost]
        public async Task<IActionResult> Post([FromBody] GraphQLQuery query)
        {
            if (query == null) { throw new ArgumentNullException(nameof(query)); }
            var inputs = query.Variables.ToInputs();
            var executionOptions = new ExecutionOptions
            {
                Schema = _schema,
                Query = query.Query,
                Inputs = inputs,
                OperationName = query.OperationName,                
            };

            var result = await _documentExecuter.ExecuteAsync(executionOptions).ConfigureAwait(false);

            if (result.Errors?.Count > 0)
            {
                return BadRequest(result);
            }

            return Ok(result);
        }

查询:

我发送此查询

query getAllUsers
{
    items {
      email
  }
}

这是有效的。
但是,如果我更改任何值的操作名称,查询也会执行并获得用户。

query getAllCompanies
{
    items {
      email
  }
}

我可以在请求中写任何操作名称,它会成功执行。


我只想通过某些操作名称(在我的情况下为getAllUsers)询问用户,我可以在定义的架构中设置某处。如果我跳过操作名称,则不应执行请求。

我该怎么做?

【问题讨论】:

    标签: c# graphql graphql-dotnet


    【解决方案1】:

    您将 getAllUsers() 映射到错误的位置,您应该将该方法映射为 RootQuery 中的 ListGraphType,然后当您调用类似这样的内容时,它应该返回所有用户。

    query getAllUsers
       {
       users
       items {
         email
            }
       }
    

    注意查询getAllUsers是任意的,你可以改成查询getWhatEver,还是会得到同样的结果。 但是通过上面的这个 graphql 查询,您将返回一个包含项目字段的用户列表,并且项目具有一个电子邮件字段。如果您只想返回一个对象,则需要映射一个 UserType 字段,该字段实际上将返回您正在寻找的对象。

    如果你这样写,查询也将在没有查询 GetAllUsers 的情况下执行

       {
       users
       items {
         email
            }
       }
    

    再次查看文档和示例以获得更多说明。

    【讨论】:

      猜你喜欢
      • 2022-12-01
      • 2021-11-23
      • 2019-09-19
      • 2019-11-24
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 2020-06-20
      相关资源
      最近更新 更多