Node.js异步函数未等待API响应引发undefined错误,如何解决?
解决Node.js异步API调用的等待问题
你的代码有两个核心问题导致了undefined错误,直接调整逻辑就能解决,不需要大重构:
问题1:异步函数调用未使用await
doGetRequest是async函数,调用时如果不用await,返回的是Promise对象而非API实际返回的数据。你直接用obj.bids[i][0]访问Promise的属性,自然会得到undefined。
问题2:doGetRequest未返回数据
函数里只打印了data,但没有把它return出来,就算用了await也拿不到结果。
修正后的完整代码
// 把依赖引入移到文件顶部,避免重复初始化 const axios = require('axios'); async function doGetRequest(URL) { const res = await axios.get(URL); // 必须return获取到的数据,才能让调用方拿到结果 return res.data; } // 把readBids改成async函数,内部才能使用await async function readBids(pairs) { const TrianglePair = { pair: [], price: [], typeTrade: "", tradeAmount: 0, highestProfit: "" }; for (let i = 0; i < pairs.length; i++) { // 用await等待API请求完成,拿到实际响应数据 const obj = await doGetRequest(`https://api.kucoin.com/api/v1/market/orderbook/level2_20?symbol=${pairs[i]}`); // 注意:你原来写死了SHIB-USDT,这里改成循环变量pairs[i]才符合逻辑 const tempVal = obj.bids[0][0]; // 根据API返回的orderbook结构,取第一个bid的价格 TrianglePair.pair.push(pairs[i]); TrianglePair.price.push(tempVal); } // return放在循环外,避免只执行一次循环就提前返回 return TrianglePair; } // 调用readBids的两种方式: // 方式1:在async函数内用await async function main() { try { const result = await readBids(["SHIB-USDT", "BTC-USDT"]); console.log(result); } catch (err) { console.error('请求出错:', err); } } main(); // 方式2:用.then()处理Promise readBids(["SHIB-USDT", "BTC-USDT"]) .then(result => console.log(result)) .catch(err => console.error('请求出错:', err));
额外注意事项
- 永远要给异步请求加错误捕获(
try/catch或.catch()),避免API请求失败导致程序崩溃。 - 不要在循环里硬编码请求地址,要结合循环变量动态生成,否则循环失去意义。
内容的提问来源于stack exchange,提问作者JohnyRocket85
相关产品推荐
相关产品推荐

