Joes Antwort (append {"name":"ratio" , value:data.active/data.total}
zum Ergebnis, sobald das Ergebnis aus der Datenbank abgerufen wird) würde dies tun, ohne Schemaänderungen vorzunehmen.
Als alternative Methode oder als elegantere Methode in GraphQL können die Feldnamen im Typ selbst angegeben werden, anstatt sie als Argumente zu übergeben. Und berechnen Sie ratio
durch Schreiben eines Resolvers.
Das GraphQL-Schema wäre also:
Item {
total: Int,
active: Int,
ratio: Float
}
type Query {
items: [Item]
}
Der Client spezifiziert die Felder:
{
items {
total
active
ratio
}
}
Und ratio
kann innerhalb des Resolvers berechnet werden.
Hier ist der 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)))