Réponse de Joe (ajoutez {"name":"ratio" , value:data.active/data.total}
au résultat une fois que le résultat est extrait de la base de données) le ferait sans apporter de modifications au schéma.
Comme méthode alternative ou comme manière plus élégante de le faire dans GraphQL, les noms de champ peuvent être spécifiés dans le type lui-même au lieu de les transmettre en tant qu'arguments. Et calculez le ratio
en écrivant un résolveur.
Ainsi, le schéma GraphQL serait :
Item {
total: Int,
active: Int,
ratio: Float
}
type Query {
items: [Item]
}
Le client précise les champs :
{
items {
total
active
ratio
}
}
Et ratio
peut être calculé à l'intérieur du résolveur.
Voici le code :
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)))