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(); }); }
关键修改点:
- 不再直接resolve
response对象,而是通过data事件拼接所有响应数据块 - 在
end事件中,将完整的响应内容(可选择解析为JSON)resolve出去 - 同时返回状态码,方便后续判断请求结果
这样处理后,返回的是纯数据(字符串或JSON对象),不存在循环引用,就不会触发栈溢出错误了。
内容的提问来源于stack exchange,提问作者Yuki
相关产品推荐
相关产品推荐

