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

如何不硬编码读取API响应数据?CLI加密货币查询报错解决

问题

编写CLI命令时,接收用户输入的加密货币标识(如BTC、ETH)和计价货币类型,尝试动态通过变量coinOption获取对应币种数据时触发错误:TypeError: Cannot read properties of undefined (reading 'symbol')。硬编码res.data.data.BTC可正常获取数据,但无法适配多币种场景。

错误代码片段:

let coinData = res.data.data.coinOption;
let output = `Coin : ${coinData.symbol} (${coinData.name}) | Price : ${coinData.quote.INR.price} | Rank : ${coinData.cmc_rank} | Change 24H : ${coinData.quote.INR.percent_change_24h}%`;

API返回数据结构(示例):

"data": {
    "BTC": [
        {
            "id": 1,
            "name": "Bitcoin",
            "symbol": "BTC",
            "slug": "bitcoin",
            "num_market_pairs": 11018,
            "date_added": "2010-07-13T00:00:00.000Z",
            "quote": {
                "INR": {
                    "price": 3500000,
                    "percent_change_24h": 2.5
                }
            }
        }
    ]
}
解决方案

问题出在三个核心点:

  • 动态属性访问错误:JavaScript中用.访问对象属性时,会把后续字符串当作固定属性名,而非变量值。必须用方括号语法obj[variable]来动态访问变量对应的属性。
  • 忽略API数据结构:接口返回的币种数据是数组类型(比如BTC对应的值是包含单个对象的数组),需要先提取数组第一个元素。
  • 计价货币硬编码:输出中的INR是固定值,应替换为用户输入的curOption变量,适配不同计价货币。

修改后的核心代码:

// 动态获取币种数据,方括号语法 + 取数组第一个元素
let coinData = res.data.data[coinOption][0];
// 用curOption替换硬编码的INR,支持动态计价货币
let output = `Coin : ${coinData.symbol} (${coinData.name}) | Price : ${coinData.quote[curOption].price} | Rank : ${coinData.cmc_rank} | Change 24H : ${coinData.quote[curOption].percent_change_24h}%`;

完整修改后的CryptoAPI类:

import axios from "axios";
import colors from "colors";

class CryptoAPI {
  constructor(apikey) {
    this.apikey = apikey;
    this.baseUrl =
      "https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest";
  }

  async getPriceData(coinOption, curOption) {
    try {
      const res = await axios.get(
        `${this.baseUrl}?symbol=${coinOption}&convert=${curOption}`,
        {
          headers: {
            "X-CMC_PRO_API_KEY": this.apikey,
          },
        }
      );

      // 修复动态属性访问 + 处理数组结构
      let coinData = res.data.data[coinOption][0];
      // 修复计价货币硬编码问题
      let output = `Coin : ${coinData.symbol} (${coinData.name}) | Price : ${coinData.quote[curOption].price} | Rank : ${coinData.cmc_rank} | Change 24H : ${coinData.quote[curOption].percent_change_24h}%`;

      return output;
    } catch (error) {
      console.log(error);
    }
  }
}

export default CryptoAPI;
额外优化建议
  • 添加合法性校验:判断res.data.data[coinOption]是否存在,避免用户输入无效币种时触发新的报错。
  • 格式化输出:对价格、涨跌幅做小数位数保留处理,提升CLI输出的可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:25:34