如何为给定响应定义GraphQL Schema的typeDefs?解决运行报错
问题分析与解决方案
你的代码存在两个核心问题导致类型匹配错误:
- 字段名大小写不匹配:响应数据的顶级键是大写的
Compact,但你定义的Compact类型里用了小写的compact,GraphQL字段名区分大小写,导致无法匹配。 - 类型定义覆盖不全:响应数据中存在三维嵌套数组(比如第二个子数组的第四个元素是
[7, 2.567]),但你定义的[[Float]]仅支持二维浮点数数组,无法处理混合了浮点数和数组的元素。
以下是两种可行的修正方案:
方案一:使用JSON标量(推荐,适配不规则数据结构)
对于这种嵌套层级不固定的不规则数组,直接使用JSON标量是最便捷的方式,无需复杂的类型嵌套定义。
步骤1:安装依赖(如果使用Apollo Server等框架)
npm install graphql-scalars
步骤2:修正typeDefs与解析器
const { JSONScalar } = require('graphql-scalars'); const { gql } = require('apollo-server'); const typeDefs = gql` scalar JSON type Compact { Compact: JSON! # 匹配原数据的大写键名 } type Query { response(count: ID!): Compact } `; const resolvers = { JSON: JSONScalar, // 注册JSON标量解析器 Query: { response: () => CompactRes, }, };
方案二:递归联合类型(强类型校验场景)
如果需要严格的类型校验,可以定义递归联合类型来支持"浮点数或浮点数数组"的嵌套结构:
修正后的typeDefs
type NumericArray { items: [NumericValue!]! } union NumericValue = Float | NumericArray type Compact { Compact: [NumericValue!]! } type Query { response(count: ID!): Compact }
对应的解析器
const resolvers = { NumericValue: { __resolveType(value) { return Array.isArray(value) ? 'NumericArray' : 'Float'; }, }, NumericArray: { items(parent) { return parent; }, }, Query: { response: () => CompactRes, }, };
内容的提问来源于stack exchange,提问作者Gowtham
相关产品推荐
相关产品推荐

