如何在后端创建GraphQL对象?如何生成后端可用的Hydrated GraphQL对象?
嗨,我来帮你搞定这两个GraphQL后端相关的问题:
1. 如何在后端创建GraphQL对象?
在后端创建GraphQL对象的核心是用GraphQLObjectType定义类型结构,我以Node.js环境为例,给你一步步演示:
首先确保你已经安装了graphql包:
npm install graphql
然后就可以定义你的GraphQL对象类型了:
const { GraphQLObjectType, GraphQLString, GraphQLInt } = require('graphql'); // 定义一个Person对象类型 const PersonType = new GraphQLObjectType({ name: 'Person', // 这个名称是GraphQL系统里的唯一标识,必填 description: '用来描述个人基本信息的类型', // 可选描述,方便自动生成文档 fields: () => ({ name: { type: GraphQLString }, // 字段名 + 对应的GraphQL标量类型 age: { type: GraphQLInt }, // 还可以给字段加resolve函数,动态计算字段值 fullName: { type: GraphQLString, resolve: (parent) => { // parent是当前对象的数据源,比如从数据库拿到的原始数据 return `${parent.firstName} ${parent.lastName}`; } } }) });
如果要把这个类型加到你的GraphQL Schema里,供客户端查询,还需要定义根查询类型:
const { GraphQLSchema, GraphQLObjectType } = require('graphql'); const RootQuery = new GraphQLObjectType({ name: 'RootQuery', fields: { // 定义一个查询接口,返回PersonType类型的数据 getPerson: { type: PersonType, args: { id: { type: GraphQLString } }, // 查询时传入的参数 resolve(parent, args) { // 这里写获取数据的逻辑,比如从数据库查询 return { firstName: 'Bill', lastName: 'Gates', age: 68 }; } } } }); // 最终生成可用于服务器的Schema const schema = new GraphQLSchema({ query: RootQuery });
2. 生成带__typename和默认null字段的Hydrated GraphQL对象
你已经有了原始对象和GraphQLObjectType定义,要生成类似服务器返回的结构,本质就是补全所有类型定义的字段(没有值的设为null),再加上__typename字段。我写一个实用的工具函数来实现:
const { getNamedType } = require('graphql'); function hydrateGraphQLObject(rawObj, graphQLType) { // 处理包装类型(比如NonNull、List),拿到实际的基础类型 const targetType = getNamedType(graphQLType); // 如果是标量类型,直接返回值或null if (!targetType.getFields) { return rawObj !== undefined ? rawObj : null; } const fields = targetType.getFields(); const hydratedResult = {}; // 遍历所有定义的字段,从原始对象取值,没有则设为null for (const fieldName in fields) { const fieldType = fields[fieldName].type; hydratedResult[fieldName] = hydrateGraphQLObject(rawObj[fieldName], fieldType); } // 添加__typename字段,值为类型的名称 hydratedResult.__typename = targetType.name; return hydratedResult; } // 用你的示例来测试 const obj = { name: 'Bill' }; const Person = new GraphQLObjectType({ name: 'Person', fields: { name: { type: GraphQLString }, age: { type: GraphQLInt }, email: { type: GraphQLString } } }); const hydratedObj = hydrateGraphQLObject(obj, Person); console.log(hydratedObj); // 输出结果: { name: 'Bill', age: null, email: null, __typename: 'Person' }
这个函数还支持嵌套的GraphQL对象类型——如果你的Person类型里有一个Address字段(也是GraphQLObjectType),它会自动递归处理,补全所有嵌套字段的null值和__typename。
内容的提问来源于stack exchange,提问作者Fernando De La Cruz
相关产品推荐
相关产品推荐

