Node.js使用https.request保存GET请求响应为变量时返回undefined问题
解决Node.js https GET请求异步响应无法存入变量的问题
问题根源
Node.js的网络请求是异步非阻塞的:res.on('end')事件只有在响应数据完全接收完成后才会触发,而你在req.end()之后直接执行的console.log('RESULTS: ' + finalResponse)是同步代码,此时响应还没接收完毕,finalResponse自然未被赋值,返回undefined。
解决方案
方案1:用Promise封装 + async/await(推荐)
将请求逻辑封装成Promise,通过async/await等待异步操作完成后获取结果:
const https = require('https'); // 封装带body的GET请求函数 function getWithBody(url, options, postData) { return new Promise((resolve, reject) => { let finalResponse = ''; const req = https.request(url, options, (res) => { // 接收分片响应数据 res.on('data', (chunk) => { finalResponse += chunk; }); // 响应接收完成,返回结果 res.on('end', () => { // 若返回JSON格式,可添加JSON.parse(finalResponse)转换为对象 resolve(finalResponse); }); }); // 捕获请求错误 req.on('error', (err) => { reject(err); }); req.write(postData); req.end(); }); } // 使用示例 (async () => { try { // 替换为你的实际请求参数 const results = await getWithBody(url, options, postData); console.log('RESULTS: ' + results); // 后续业务逻辑直接使用results即可 } catch (err) { console.error('请求失败:', err); } })();
方案2:使用回调函数
如果项目不支持async/await,可通过回调函数获取异步结果:
const https = require('https'); function getWithBody(url, options, postData, callback) { let finalResponse = ''; const req = https.request(url, options, (res) => { res.on('data', (chunk) => { finalResponse += chunk; }); res.on('end', () => { // 成功时传递结果 callback(null, finalResponse); }); }); req.on('error', (err) => { // 失败时传递错误 callback(err); }); req.write(postData); req.end(); } // 使用示例 getWithBody(url, options, postData, (err, results) => { if (err) { console.error('请求失败:', err); return; } console.log('RESULTS: ' + results); // 后续业务逻辑放在这里 });
注意事项
- 务必初始化
finalResponse为空字符串,避免出现undefined与数据拼接的异常 - 如果第三方API返回JSON格式数据,记得在
end事件中用JSON.parse(finalResponse)将字符串转为对象后再使用
内容的提问来源于stack exchange,提问作者Eli Chitrit
相关产品推荐
相关产品推荐

