如何设置GraphQLObjectType动态非必填字段以接收动态键值对
GraphQL动态字段适配方案
GraphQL原生的强类型设计要求字段提前声明,不支持完全未定义的动态字段,但可以通过两种方案适配你当前的果汁店多规格场景:
方案一:重构为嵌套列表类型(推荐)
这是完全符合GraphQL设计规范的最佳实现,把可变的规格封装为独立的嵌套类型,用数组承载不同门店的自定义规格:
类型定义代码
// 定义通用饮品规格类型 const ServingSpec = new GraphQLObjectType({ name: "ServingSpec", fields: { // 规格名称,支持店主自定义内容,比如"Cute Small"、"Xlarge" specName: { type: GraphQLString }, // 对应规格的售价 price: { type: GraphQLFloat } } }) // 重构后的Menu类型 const MenuType = new GraphQLObjectType({ name: "Menu", fields: { name: { type: GraphQLString }, // 规格数组,可容纳任意数量的自定义规格 specs: { type: new GraphQLList(ServingSpec) } } })
对应查询语句
{ menus { name specs { specName price } } }
这个方案的优势是可以完整保留GraphQL的类型校验、字段提示、缓存等所有原生能力,后端存储也可以配合MySQL做规格表和菜单表的关联,完全适配不同门店自定义规格的需求。
方案二:使用JSON标量存储动态结构(不推荐)
如果确实需要存储完全无固定结构的字段,可以引入自定义JSON标量,直接返回整个动态对象:
类型定义代码
// 引入自定义JSON标量 const GraphQLJSON = require('graphql-type-json'); const MenuType = new GraphQLObjectType({ name: "Menu", fields: { name: { type: GraphQLString }, // 该字段可存储任意结构的JSON数据 dynamicSpecs: { type: GraphQLJSON } } })
对应查询语句
{ menus { name dynamicSpecs } }
该方案的弊端是会丢失GraphQL的类型校验、字段提示等能力,客户端无法提前感知返回结构,仅适合临时过渡场景使用。
内容的提问来源于stack exchange,提问作者Suvel Mano
相关产品推荐
相关产品推荐

