如何不硬编码读取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
相关产品推荐
相关产品推荐

