如何在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
相关产品推荐
相关产品推荐

