Mysql
 sql >> Base de données >  >> RDS >> Mysql

GraphQL - renvoie le type calculé en fonction de l'argument

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)))