Câu trả lời của Joe (thêm {"name":"ratio" , value:data.active/data.total}
đến kết quả sau khi kết quả được tìm nạp từ cơ sở dữ liệu) sẽ thực hiện điều đó mà không thực hiện bất kỳ thay đổi lược đồ nào.
Là một phương pháp thay thế hoặc là một cách thanh lịch hơn để làm điều đó trong GraphQL, tên trường có thể được chỉ định trong chính kiểu thay vì chuyển chúng dưới dạng đối số. Và tính toán ratio
bằng cách viết một trình phân giải.
Vì vậy, lược đồ GraphQL sẽ là:
Item {
total: Int,
active: Int,
ratio: Float
}
type Query {
items: [Item]
}
Máy khách chỉ định các trường:
{
items {
total
active
ratio
}
}
Và tỷ lệ ratio
có thể được tính toán bên trong trình phân giải.
Đây là mã:
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)))