I am using Apollo Graphql for getting a list of different models or types. I tried to use inhirit, but I didn't get it. I was trying to use whole object, but I want to ommit the fields that I don't need.
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:
car {
name: String
wheelNumber: Integer
}
trunk extends car {
cargoSize: Integer
}
So I created my Graphql Schema with this way:
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
.
query {
vehicles {
name
wheelNumber
cargoSize
}
}
I would like to ommit cargoSize field when it is null. 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. 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. Then for making query I just have to specify all the common fields and then using the keyword ... on
and specify all trunk fields:
query {
vehicles {
name
wheelNumber
... on truck {
cargoSize
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.