簡體   English   中英

GraphQL 查詢省略了不同類型對象的 null 字段

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

我正在使用 Apollo Graphql 來獲取不同型號或類型的列表。 我嘗試使用 inhirit,但我沒有得到它。 我試圖使用整個 object,但我想省略我不需要的字段。

我使用可為空字段創建架構類型,因為並非所有對象都具有所有字段。

我將通過下一個示例更好地解釋:

這是一個簡單的示例 class (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;
    },
  }
};

當我執行車輛查詢時,如果 object 沒有 cargoSize 字段,它也會返回所有字段,它會返回cargoSize: null

query {
  vehicles {
    name
    wheelNumber
    cargoSize
  }
}

當它是 null 時,我想省略 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
        },                     
    ]
}

有什么辦法嗎? 我一直在研究,但我沒有找到任何關於它的信息。

我知道了。 我沒有看到 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
    }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM