Jawaban Joe (tambahkan {"name":"ratio" , value:data.active/data.total}
ke hasil setelah hasilnya diambil dari database) akan melakukannya tanpa membuat perubahan skema.
Sebagai metode alternatif atau sebagai cara yang lebih elegan untuk melakukannya di GraphQL, nama bidang dapat ditentukan dalam tipe itu sendiri alih-alih meneruskannya sebagai argumen. Dan hitung ratio
dengan menulis resolver.
Jadi, skema GraphQL akan menjadi:
Item {
total: Int,
active: Int,
ratio: Float
}
type Query {
items: [Item]
}
Klien menentukan bidang:
{
items {
total
active
ratio
}
}
Dan ratio
dapat dihitung di dalam resolver.
Ini kodenya:
const express = require('express');
const graphqlHTTP = require('express-graphql');
const { graphql } = require('graphql');
const { makeExecutableSchema } = require('graphql-tools');
const getFieldNames = require('graphql-list-fields');
const typeDefs = `
type Item {
total: Int,
active: Int,
ratio: Float
}
type Query {
items: [Item]
}
`;
const resolvers = {
Query: {
items(obj, args, context, info) {
const fields = getFieldNames(info) // get the array of field names specified by the client
return context.db.getItems(fields)
}
},
Item: {
ratio: (obj) => obj.active / obj.total // resolver for finding ratio
}
};
const schema = makeExecutableSchema({ typeDefs, resolvers });
const db = {
getItems: (fields) => // table.select(fields)
[{total: 10, active: 5},{total: 5, active: 5},{total: 15, active: 5}] // dummy data
}
graphql(
schema,
`query{
items{
total,
active,
ratio
}
}`,
{}, // rootValue
{ db } // context
).then(data => console.log(JSON.stringify(data)))