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

TypeScript中使用原生https库发起异步请求报错求助

问题原因及修复方案

你的代码出错的核心原因是直接resolve了Node.js的HTTP响应流对象。response是一个包含循环引用的可读流(比如它和内部的socket对象互相引用),当后续代码尝试处理这个对象(比如打印、序列化)时,会触发递归遍历其属性,最终超出调用栈上限,抛出RangeError: Maximum call stack size exceeded。

你需要在response事件中收集完整的响应内容,而不是直接返回流对象。以下是修复后的代码:

import * as https from "https";

function openRequest(options : any) {
    return new Promise((resolve, reject) => {
        const request = https.request(options, (response : any) => {
            let responseBody = '';

            // 监听data事件,收集响应数据块
            response.on('data', (chunk : string | Buffer) => {
                responseBody += chunk;
            });

            // 响应结束时,返回完整的响应内容
            response.on('end', () => {
                // 如果是JSON格式,可以解析后返回,否则直接返回字符串
                try {
                    const parsedData = JSON.parse(responseBody);
                    resolve({ statusCode: response.statusCode, data: parsedData });
                } catch (err) {
                    resolve({ statusCode: response.statusCode, data: responseBody });
                }
            });
        }).on('error', (error : any) => {
            reject(error);
        });

        request.end();
    });
}

关键修改点:

  • 不再直接resolveresponse对象,而是通过data事件拼接所有响应数据块
  • 在end事件中,将完整的响应内容(可选择解析为JSON)resolve出去
  • 同时返回状态码,方便后续判断请求结果

这样处理后,返回的是纯数据(字符串或JSON对象),不存在循环引用,就不会触发栈溢出错误了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 08:50:23