ジョーの答え({"name":"ratio" , value:data.active/data.total}
を追加 結果がデータベースからフェッチされると、結果に対して)スキーマを変更せずにそれを実行します。
別の方法として、またはGraphQLでそれを行うためのより洗練された方法として、フィールド名を引数として渡す代わりに、型自体で指定することができます。そして、ratio
を計算します リゾルバを作成することによって。
したがって、GraphQLスキーマは次のようになります。
Item {
total: Int,
active: Int,
ratio: Float
}
type Query {
items: [Item]
}
クライアントはフィールドを指定します:
{
items {
total
active
ratio
}
}
そしてratio
リゾルバ内で計算できます。
コードは次のとおりです:
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)))