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

如何为给定响应定义GraphQL Schema的typeDefs?解决运行报错

问题分析与解决方案

你的代码存在两个核心问题导致类型匹配错误:

  1. 字段名大小写不匹配:响应数据的顶级键是大写的Compact,但你定义的Compact类型里用了小写的compact,GraphQL字段名区分大小写,导致无法匹配。
  2. 类型定义覆盖不全:响应数据中存在三维嵌套数组(比如第二个子数组的第四个元素是[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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:03:27