GraphQL 不允许查询不同的字段

Posted

技术标签:

【中文标题】GraphQL 不允许查询不同的字段【英文标题】:GraphQL doesn't allow querying on different fields 【发布时间】:2020-07-02 15:09:53 【问题描述】:

我是 GraphQL 的绝对初学者。如果问题是业余的,请道歉。我正在编写这个 graphQL 端点,它将按姓名过滤人员。效果很好,但我希望能够

按姓名、年龄、电话号码等多个参数过滤

使用参数组合搜索..

我目前的计划:

var express = require("express");
var express_graphql = require("express-graphql");
var  buildSchema  = require("graphql");
var Sequelize = require("sequelize")
var db = new Sequelize(
  "users",
  "root",
  "pass",
  
    host: "localhost",
    dialect: "mysql"
  
);

var calls = db.define(
  "calls",
  
    person_id: 
      type: Sequelize.INTEGER,
      allowNull: false,
      primaryKey: true
    ,
    name: 
      type: Sequelize.STRING,
      allowNull: false
    ,
    age: 
      type: Sequelize.INTEGER,
      allowNull: false
    ,
    address: 
      type: Sequelize.STRING,
      allowNull: false
    ,
    company: 
      type: Sequelize.String,
      allowNull: false
    ,
    email: 
      type: Sequelize.STRING,
      allowNull: false
    
  ,
  
    tableName: "person"
  
);

// Construct a schema, using GraphQL schema language
var schema = buildSchema(`
  type Query 
    Person(person_id: Integer!): [Person]
  
  type Person 
    person_id: Integer
    name: String
    age: Integer
    address: String
    company: String
    email: String 
  
`);

var getperson = function(args) 
  if (args.person_id) 
    var p_name = args.person_id;
    return calls.findAll(
      where: 
        name: p_name
      
    );
  
;

// The root provides a resolver function for each API endpoint
var root = 
  person: getperson
;

var app = express();
app.use(
  "/graphql",
  express_graphql(
    schema: schema,
    rootValue: root,
    graphiql: true
  )
);
app.listen(4000);
console.log("Running a GraphQL API server at http://localhost:4000/graphql");

试过这样做:

 type Query 
    Person(person_id: Integer!): [Person]
    Person(name: String!): [Person]
  

但它说 Person 只能定义一次。

【问题讨论】:

顺便说一句,你probably shouldn't be using buildSchema。 【参考方案1】:

您不能“重载”字段定义。您可以使用可为空的参数定义单个字段

person(personId: Int, name: String)

或创建不同名称的字段

personById(id: Int!)
personByName(name: String!)

【讨论】:

以上是关于GraphQL 不允许查询不同的字段的主要内容,如果未能解决你的问题,请参考以下文章

如何使用不同的字段生成相同的 graphql 查询

GraphQL 中的分组查询(不是“分组依据”)

如何允许石墨烯GraphQl中的任何字段过滤

Apollo GraphQL - 是不是可以执行请求不同字段的相同查询?

GraphQL 实现“不允许”

如何创建可以在不同字段上搜索的 graphql 模式?