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

Node.js中如何存储HTTPS响应数据?异步问题求解

解决异步API调用返回结果的问题

我太懂你这种困扰了——异步操作的执行顺序总是打破我们想直接拿到结果的预期,你之前试的全局变量、回调赋值都失效,核心原因就是在你试图返回变量的时候,API请求还没跑完呢!下面给你一套清晰的解决方案,用Promise + async/await重构代码,让apiCall能像你期望的那样返回结果:

第一步:把异步请求封装成Promise

先重构externalApi函数,去掉回调逻辑,改用Promise来管理异步流程,这样我们能更灵活地控制结果传递:

function externalApi(url, protocol) {
  return new Promise((resolve, reject) => {
    try {
      const https = $.require(protocol);
      const request = https.request(url, function (response) {
        let str = '';
        const statusCode = response.statusCode;
        const headers = response.headers;

        response.on('data', function (data) {
          str += data;
        });

        response.on('end', function () {
          console.log("Data is " + str);
          console.log("Status Code is " + statusCode);
          console.log("Header is " + JSON.stringify(headers));
          // 请求成功时,打包需要的数据传递出去
          resolve({
            retrievedData: str,
            statusCode: statusCode,
            headers: headers
          });
        });
      });

      request.on('error', function (e) {
        console.log('Problem with request: ' + e.message);
        // 请求失败时传递错误信息
        reject(e);
      });

      request.end();
    } catch (err) {
      console.log("the error is" + err);
      reject(err);
    }
  });
}

第二步:修改apiCall为异步函数

把apiCall改成async函数,用await等待externalApi的异步结果,这样就能自然返回处理后的内容:

async function apiCall(url, protocol) {
  try {
    // 等待异步请求完成并拿到结果
    const responseData = await externalApi(url, protocol);
    const callStatus = {};
    
    if (responseData.statusCode === 200) {
      callStatus.retrievedData = responseData.retrievedData;
      callStatus.statusCode = responseData.statusCode;
      callStatus.headers = responseData.headers;
      callStatus.MESSAGE = "Successfully called";
    } else {
      // 处理非200状态码的情况
      callStatus.statusCode = responseData.statusCode;
      callStatus.MESSAGE = `Call failed with status code: ${responseData.statusCode}`;
    }
    
    console.log(callStatus);
    // 返回最终处理后的结果
    return callStatus;
  } catch (err) {
    console.error("API call error:", err);
    // 抛出错误,让调用方可以捕获处理
    throw new Error(`API call failed: ${err.message}`);
  }
}

第三步:如何调用apiCall获取结果

因为apiCall是异步函数,你需要用以下两种方式之一拿到结果:

方式1:在async函数中使用await

async function handleApiCall() {
  try {
    const result = await apiCall('你的目标URL', 'https');
    console.log("The result is", result);
    // 在这里处理返回的result数据
  } catch (err) {
    console.error("获取结果失败:", err);
  }
}

// 执行函数
handleApiCall();

方式2:用.then()链式调用(兼容旧环境)

如果你的运行环境不支持async/await,也可以用Promise的链式写法:

apiCall('你的目标URL', 'https')
  .then(result => {
    console.log("The result is", result);
    // 处理结果
  })
  .catch(err => {
    console.error("获取结果失败:", err);
  });

为什么之前的方法没用?

你之前尝试的直接赋值变量再return,本质是因为https.request是异步操作——当你执行return output时,请求还在后台发送,回调函数根本没触发,所以output自然是空的。Promise和async/await的核心作用就是让代码"等待"异步操作完成后再继续执行,这样就能拿到完整的请求结果了。

内容的提问来源于stack exchange,提问作者Arun Elangovan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:32:32