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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:00:59