调用CoinGecko的global API返回值执行map方法报undefined如何解决
问题根因
- CoinGecko的
/global接口返回的是单个对象,不是数组,map是仅数组支持的方法,直接调用必然报错。 - 你对接口返回结构的解构也有问题:和第一个coins markets接口一样,
coinGeckoClient.global()返回的结果外层包裹了data字段,你直接从props.nextResult解构global拿到的是undefined,相当于你在调用undefined.map,自然抛出对应错误。
修复步骤
- 先明确接口结构:调用
https://api.coingecko.com/api/v3/global返回的核心数据都在data字段下,包含markets、active_cryptocurrencies等单值属性,没有需要遍历的数组结构,不需要用map。 - 修正组件代码:
export default function Home(props) { // 第一个接口的加密货币列表数据保持原有逻辑即可 const { data: coinsList } = props.result; // 正确解构global接口的返回统计数据 const { data: globalStats } = props.nextResult; return ( <> {/* 原有coins列表渲染逻辑省略 */} <table className="table2 table-hover table-dark"> <thead> <tr> <th>Markets</th> </tr> </thead> <tbody> {/* 直接取值渲染,加可选链做兼容避免空值报错 */} <tr> <td>{globalStats?.markets}</td> </tr> </tbody> </table> </> ) }
如果确实有遍历global所有统计项的需求,可以先把对象转成数组再遍历:
<tbody> {Object.entries(globalStats || {}).map(([statKey, statValue]) => ( <tr key={statKey}> <td>{statKey.replace('_', ' ')}</td> <td>{statValue}</td> </tr> ))} </tbody>
额外优化建议
可以在getServerSideProps里加异常捕获,避免接口请求失败导致页面直接500:
export async function getServerSideProps(context) { const params = { order: CoinGecko.ORDER.MARKET_CAP_DESC }; try { const [result, nextResult] = await Promise.all([ coinGeckoClient.coins.markets({params}), coinGeckoClient.global() ]); return { props: { result, nextResult }, } } catch (e) { return { props: { result: {data: []}, nextResult: {data: {}} } } } }
内容的提问来源于stack exchange,提问作者Humshark
相关产品推荐
相关产品推荐

