You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在后端创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:00:24