【问题标题】:GraphQL query omitting null fields for different type objectsGraphQL 查询省略了不同类型对象的空字段
【发布时间】:2020-07-24 20:23:07
【问题描述】:

我正在使用 Apollo Graphql 来获取不同模型或类型的列表。我尝试使用 inhirit,但我没有得到它。我试图使用整个对象,但我想省略不需要的字段。

我使用可为空字段创建架构类型,因为并非所有对象都具有所有字段。

我会用下一个例子更好地解释:

这是一个简单的示例类(OBJECT)设计:

car {
    name: String
    wheelNumber: Integer
}

trunk extends car {
    cargoSize: Integer
}

所以我用这种方式创建了我的 Graphql Schema:

input vehicleInput {
    name: String,
    wheelNumber: Integer,
    cargoSize: Integer
}

type vehicle {
    name: String,
    wheelNumber: Integer,
    cargoSize: Integer
}

type Query {
    vehicles: [vehicle]
}

type Mutation {
    addVehicle(input: vehicleInput ): vehicle!
}

解析器示例:

import { vehicle } from "./model";

export const resolvers = {
  Query: {
    vehicles : () => {
        return vehicle.find({});
      },
  },
  Mutation: {
    addVehicle: (_, { input }) => {
      const inputResponse = vehicle.create(input);
      return inputResponse;
    },
  }
};

当我执行车辆查询时,如果对象没有 cargoSize 字段,它也会返回所有字段,它会返回 cargoSize: null

query {
  vehicles {
    name
    wheelNumber
    cargoSize
  }
}

我想在 cargoSize 字段为空时省略它。像这样:

{
    vehicles: [
        {
            name: "car 1",
            wheelNumber: 4
        },
        {
            name: "car 2",
            wheelNumber: 4
        },  
        {
            name: "truck 1",
            wheelNumber: 8,
            cargoSize: 65
        },    
        {
            name: "car 3",
            wheelNumber: 4
        },                     
    ]
}

而不是这个:

{
    vehicles: [
        {
            name: "car 1",
            wheelNumber: 4,
            cargoSize: null
        },
        {
            name: "car 2",
            wheelNumber: 4,
            cargoSize: null
        },  
        {
            name: "truck 1",
            wheelNumber: 8,
            cargoSize: 65
        },    
        {
            name: "car 3",
            wheelNumber: 4,
            cargoSize: null
        },                     
    ]
}

有什么办法吗?我一直在研究,但我没有找到任何关于它的信息。

【问题讨论】:

    标签: javascript node.js api nosql graphql


    【解决方案1】:

    我明白了。我没有看到 Graphql 有接口。很好,我声明了一个接口,然后我实现了每种类型。

    interface vehicle {
        name: String,
        wheelNumber: Integer
    }
    
    
    type car implements vehicle {
        name: String,
        wheelNumber: Integer
    }
    
    type truck implements vehicle {
        name: String,
        wheelNumber: Integer,
        cargoSize: Integer
    }
    
    type Query {
        vehicles: [vehicle]
    }
    
    type Mutation {
        addVehicle(input: vehicleInput ): vehicle!
    }
    

    解析器文件:

    import { vehicle } from "./model";
    
    export const resolvers = {
      Query: {
        vehicles : () => {
            return vehicle.find({});
          },
      },
      Mutation: {
        addVehicle: (_, { input }) => {
          const inputResponse = vehicle.create(input);
          return inputResponse;
        },
      },
      vehicle: {
        __resolveType: (obj) => {
          if(obj.cargoSize){
            return 'truck';
          }
          else{
            return 'car'
          }      
      }
    };
    
    

    这样我就完成了 API。然后为了进行查询,我只需要指定所有公共字段,然后使用关键字... on 并指定所有主干字段:

    query {
      vehicles {
        name
        wheelNumber
        ... on truck {
            cargoSize
        }
      }
    

    【讨论】:

      猜你喜欢
      • 2021-09-05
      • 1970-01-01
      • 2019-12-30
      • 2016-01-04
      • 2020-05-29
      • 1970-01-01
      • 1970-01-01
      • 2018-08-15
      • 2017-03-26
      相关资源
      最近更新 更多