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

Node.js URL请求获取的JSON数据如何赋值给外部变量

问题根因
  • request 发起的网络请求属于异步IO操作,Node.js 执行到请求代码时不会阻塞等待服务端返回结果,会立刻继续执行后续代码。
  • 你写在 request 调用之后的 console.log(var1)、return var1 执行时,请求还没有完成,回调函数还没触发,var1 还停留在初始赋值的0。
  • 只有当网络请求成功返回后,回调函数才会被触发执行,此时才会给 var1 赋上接口返回的真实值,所以回调内部可以读到正确结果。
解决方案

有两种常用的改造方式:

1. 回调函数传参

将需要用到请求结果的逻辑封装为回调函数,传入请求方法,等请求完成后调用回调把结果传出去:

function datadata(callback) {
    const request = require('request');
    request('http://x.x.x.x/json', function (error, response, body) {
      if (!error && response.statusCode == 200) {
         const importedJSON = JSON.parse(body);
         const var1 = importedJSON.result.data;
         // 请求成功,将结果通过回调返回
         callback(null, var1);
      } else {
         // 异常场景传递错误信息
         callback(error || new Error('请求异常'));
      }
    });
 }

// 调用示例
datadata(function(err, data) {
    if (err) {
        console.error('请求失败:', err);
        return;
    }
    // 所有需要用到请求结果的逻辑都在这里执行
    console.log('拿到的结果:', data);
})

2. Promise + async/await(更推荐,代码可读性更高)

可以换成原生支持Promise的请求库比如axios,用同步写法写异步逻辑:

// 先安装依赖:npm install axios
const axios = require('axios');

async function datadata() {
    try {
        const res = await axios.get('http://x.x.x.x/json');
        const var1 = res.data.result.data;
        return var1;
    } catch (err) {
        console.error('请求异常:', err);
        throw err;
    }
}

// 调用示例
(async function() {
    const result = await datadata();
    // 此处可拿到正确的请求结果
    console.log('拿到的结果:', result);
    // 后续业务逻辑写在这里即可
})();

内容的提问来源于stack exchange,提问作者Dam Yi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 14:15:03