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

