简体   繁体   English

GraphQL 查询省略了不同类型对象的 null 字段

[英]GraphQL query omitting null fields for different type objects

I am using Apollo Graphql for getting a list of different models or types.我正在使用 Apollo Graphql 来获取不同型号或类型的列表。 I tried to use inhirit, but I didn't get it.我尝试使用 inhirit,但我没有得到它。 I was trying to use whole object, but I want to ommit the fields that I don't need.我试图使用整个 object,但我想省略我不需要的字段。

I created my schema type with nullables fields, because all objects don't have all fields.我使用可为空字段创建架构类型,因为并非所有对象都具有所有字段。

I will explain better with the next example:我将通过下一个示例更好地解释:

This is a simple example class (OBJECT) design:这是一个简单的示例 class (OBJECT) 设计:

car {
    name: String
    wheelNumber: Integer
}

trunk extends car {
    cargoSize: Integer
}

So I created my Graphql Schema with this way:所以我用这种方式创建了我的 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!
}

Resolver example:解析器示例:

import { vehicle } from "./model";

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

When I execute vehicles query it returns all fields also if the object doesn't have cargoSize field, it returns cargoSize: null .当我执行车辆查询时,如果 object 没有 cargoSize 字段,它也会返回所有字段,它会返回cargoSize: null

query {
  vehicles {
    name
    wheelNumber
    cargoSize
  }
}

I would like to ommit cargoSize field when it is null.当它是 null 时,我想省略 cargoSize 字段。 Like this:像这样:

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

Instead of this:而不是这个:

{
    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
        },                     
    ]
}

Are any way to do that?有什么办法吗? I have been researching, but I haven't found anything about it.我一直在研究,但我没有找到任何关于它的信息。

I got it.我知道了。 I didn't see Graphql has Interfaces.我没有看到 Graphql 有接口。 So well I declared an Interface and then I implement every type.很好,我声明了一个接口,然后我实现了每种类型。

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!
}

Resolver file:解析器文件:

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

With that I complete the API.这样我就完成了 API。 Then for making query I just have to specify all the common fields and then using the keyword ... on and specify all trunk fields:然后为了进行查询,我只需要指定所有公共字段,然后使用关键字... on并指定所有主干字段:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM