Node.js中https.request为何无法正常链式调用write、end方法?
链式调用失效原因
https.request() 返回的是 ClientRequest 可写流实例,链式调用断裂的核心原因是对write()方法的返回值存在误解:
- 所有Node.js可写流的
write()方法,返回值都是布尔值,作用是告知调用方当前流的内部缓冲区是否已满,根本不会返回流实例本身 - 执行
.write(jsonData)之后,拿到的返回值是true/false,布尔值上不存在end()方法,调用自然报错,链式逻辑直接断在这里。
修正方案
不要硬凑链式写法,先持有请求实例再分别调用方法即可,顺便修复原代码里响应解析的隐患——HTTP响应是分块传输的,单个data事件拿到的只是响应的一部分,直接调用JSON.parse大概率会碰到解析失败的问题:
const req = https.request(url, options, (response) => { const chunks = []; response.on("data", (chunk) => chunks.push(chunk)); response.on("end", () => { const resContent = Buffer.concat(chunks).toString(); console.log(JSON.parse(resContent)); }); }); req.write(jsonData); req.end();
如果想简化代码,可以直接把请求体数据传给end()方法,它会自动完成写入请求体、结束请求的操作,不需要单独调用write:
const req = https.request(url, options, (response) => { const chunks = []; response.on("data", (chunk) => chunks.push(chunk)); response.on("end", () => { console.log(JSON.parse(Buffer.concat(chunks).toString())); }); }); req.end(jsonData);
补充:Node.js官方文档从未给出过
.write().end()这种链式调用示例,属于对API设计的误判。
内容的提问来源于stack exchange,提问作者ritik jain
相关产品推荐
相关产品推荐

