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

GraphQL调用外部API获取数据时返回Null值问题求助

GraphQL返回Null的原因及修复方案

你遇到的Null问题核心是GraphQL Schema定义和外部API返回的数据结构完全不匹配导致的,咱们一步步拆解原因和修复方法:

问题根源分析

1. 返回类型不匹配

你的Schema里定义getCrypto: CryptoCurrency,意味着这个查询要返回单个加密货币对象,但你调用的Cryptocompare API实际返回的是一个包含多个币种的数组(嵌套在Data字段里),和你预期的单个类型完全不符。当GraphQL发现返回结构和Schema定义不匹配时,就会返回Null。

2. 字段层级不匹配

API返回的币种信息是嵌套结构:基础信息在CoinInfo下,价格信息在DISPLAY.USD下,但你直接把整个API返回的对象丢给GraphQL,它找不到你Schema里定义的Id、Name、PRICE这些扁平字段,自然解析为Null。

具体修复方案

第一步:修正Schema定义

既然API返回的是多个币种,把查询返回类型改成数组(如果确实要单个币种,后续再调整):

type CryptoCurrency {
  Id: ID
  Name: String
  FullName: String
  PRICE: String  # 注:API返回的价格是带符号的字符串(比如"$29,345.67"),用String更适配
  LASTUPDATE: String
}

type Query {
  getCrypto: [CryptoCurrency]  # 改成数组类型,匹配API返回的多币种结果
}

第二步:调整Resolver逻辑

从API返回的嵌套数据里提取对应字段,映射成Schema期望的结构:

import fetch from 'node-fetch'

export const resolvers = {
  Query: {
    getCrypto: async() => {
      const response = await fetch(`https://min-api.cryptocompare.com/data/top/totalvolfull?limit=10&tsym=USD`)
      const apiResult = await response.json();
      
      // 把API的嵌套数据转换成Schema要求的扁平结构
      return apiResult.Data.map(cryptoItem => ({
        Id: cryptoItem.CoinInfo.Id,
        Name: cryptoItem.CoinInfo.Name,
        FullName: cryptoItem.CoinInfo.FullName,
        PRICE: cryptoItem.DISPLAY.USD.PRICE,
        LASTUPDATE: cryptoItem.DISPLAY.USD.LASTUPDATE
      }));
    }
  },
};

额外说明

如果你的需求是返回单个币种,只需要把Resolver里的map改成取数组第一个元素(apiResult.Data[0]),同时把Schema的getCrypto返回类型改回CryptoCurrency即可。不过根据你API参数里的limit=10,显然多币种数组是更合理的选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:02:52