如何在Node.js中将API获取的数据存入全局变量?
问题根源
你这段代码的核心问题是XMLHttpRequest是异步操作——request2API函数会在HTTP请求还没拿到响应的时候就执行完了,直接返回undefined。而onload回调里的return response根本不会改变函数的返回值,所以fetchedData自然拿不到数据。
解决办法
下面给你两种实用方案,都能帮你把API返回的数据存到全局变量里:
方案一:用Promise + async/await(推荐)
把异步请求包装成Promise,再用async/await等待请求完成,最后赋值给全局变量:
// 先声明全局变量 let globalFetchedData; function request2API(option) { return new Promise((resolve, reject) => { const XMLHttpRequest = require('xhr2'); const request = new XMLHttpRequest(); request.open('GET', urlStart + ChList[option].videosList + keyPrefix + key); request.send(); request.onload = () => { if (request.status === 200) { const response = JSON.parse(request.response); resolve(response); // 把成功获取的数据传出去 } else { reject(new Error(`请求失败,状态码:${request.status}`)); } }; // 处理请求出错的情况 request.onerror = () => { reject(new Error('请求发生网络错误')); }; }); } // 用async函数处理异步逻辑 async function init() { let indexChannel = inputFunction("\n Pick an option "); try { globalFetchedData = await request2API(indexChannel); console.log(globalFetchedData); // 这里能拿到正确的响应数据 // 之后你在任何地方都可以直接用globalFetchedData这个全局变量 } catch (err) { console.error('请求出错:', err); } } // 调用初始化函数 init();
方案二:使用回调函数
如果不想用Promise,也可以通过回调函数在请求完成后给全局变量赋值:
// 声明全局变量 let globalFetchedData; function request2API(option, callback) { const XMLHttpRequest = require('xhr2'); const request = new XMLHttpRequest(); request.open('GET', urlStart + ChList[option].videosList + keyPrefix + key); request.send(); request.onload = () => { if (request.status === 200) { const response = JSON.parse(request.response); callback(null, response); // 成功时把数据传给回调 } else { callback(new Error(`请求失败,状态码:${request.status}`), null); } }; request.onerror = () => { callback(new Error('请求发生网络错误'), null); }; } let indexChannel = inputFunction("\n Pick an option "); request2API(indexChannel, (err, data) => { if (err) { console.error('请求出错:', err); return; } globalFetchedData = data; console.log(globalFetchedData); // 这里能拿到正确数据 // 所有需要用到这个数据的逻辑,要么放在这个回调里,要么直接取用全局变量 });
额外提醒
异步操作的本质就是“不会等它做完再继续执行代码”,所以你不能在同步代码里直接拿到异步请求的结果,必须等异步操作完成后再处理数据。另外,全局变量虽然能解决当前问题,但如果项目规模变大,尽量少用全局变量,避免变量污染,可以考虑用模块导出或者专门的状态管理方式来处理数据。
内容的提问来源于stack exchange,提问作者axkels
相关产品推荐
相关产品推荐

