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

如何在graphql-tag中定义JSON/Object类型?Apollo GraphQL新手咨询

如何在Apollo GraphQL的graphql-tag中定义对象/JSON类型参数

嗨,作为Apollo GraphQL新手,你碰到的这个问题其实是GraphQL强类型系统里的典型场景——GraphQL本身并没有原生的Object或JSON类型,直接写$fontFamily: Object是不符合语法规范的。下面给你两种实用的解决方案,你可以根据自己的需求选择:

方案一:定义自定义输入类型(推荐,类型安全)

GraphQL支持**输入类型(Input Type)**来描述结构化的对象参数,这是最规范的做法,能让服务器自动校验参数结构是否符合要求。

步骤1:在GraphQL Schema中定义输入类型

首先在你的后端Schema里,创建一个对应fontFamily结构的输入类型,比如:

# 定义FontFamily的输入结构,字段根据你的实际需求调整
input FontFamilyInput {
  primary: String!       # 必填的主字体
  secondary: String      # 可选的次要字体
  fallback: [String]     # 可选的字体 fallback 数组
}

步骤2:在graphql-tag的mutation中使用该输入类型

然后在你的前端代码里,把Object替换成刚才定义的FontFamilyInput:

export const CREATE_STYLE = gql`
  mutation styleCreate(
    $formID: String!
    $fontFamily: FontFamilyInput! # 使用自定义输入类型
  ) {
    styleCreate(
      formID: $formID
      fontFamily: $fontFamily
    ) {
      styleID
    }
  }
`;

这种方式的优势是类型安全,服务器会严格校验你传入的fontFamily对象是否匹配定义的结构,避免非法数据传入。

方案二:使用JSON标量类型(灵活,无结构校验)

如果你的fontFamily结构不固定,或者需要传递任意JSON数据,可以使用JSON标量类型。不过前提是你的GraphQL服务器已经配置了JSON标量支持(比如使用graphql-scalars库提供的JSON标量)。

在graphql-tag中直接使用JSON类型

配置好服务器的JSON标量后,前端代码可以这样写:

export const CREATE_STYLE = gql`
  mutation styleCreate(
    $formID: String!
    $fontFamily: JSON! # 使用JSON标量类型
  ) {
    styleCreate(
      formID: $formID
      fontFamily: $fontFamily
    ) {
      styleID
    }
  }
`;

这种方式的好处是灵活,但缺点是失去了类型校验,服务器不会检查JSON的内部结构,适合结构多变的场景。

补充说明

GraphQL是强类型语言,它不允许使用模糊的Object类型作为参数——所有类型必须明确定义。所以你不能直接写$fontFamily: Object,必须用上面两种方法之一来处理对象/JSON参数。

内容的提问来源于stack exchange,提问作者Amy Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:33:13