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
相关产品推荐
相关产品推荐

