Node.js HTTP2 DELETE请求报错ERR_STREAM_WRITE_AFTER_END求助
Node.js HTTP2 DELETE请求报错及请求体支持性解析
核心问题解答
HTTP2的DELETE请求支持携带请求体,HTTP标准(包括HTTP2)并未禁止DELETE方法附带请求体,是否接受请求体取决于服务端的具体实现,部分服务端或框架可能会对DELETE请求的请求体做限制或忽略。
报错原因分析
你遇到的Error [ERR_STREAM_WRITE_AFTER_END]: write after end错误,并非因为DELETE请求不能带请求体,而是流操作的时序问题:
- 在HTTP2的
ClientHttp2Stream中,若服务端在你调用request.write()之前就已响应并关闭请求流,后续调用write()就会触发该错误; - 单独调用
write()和end()的方式,也可能因异步流状态变化导致时序冲突。
修正后的代码
将请求体通过end()方法直接传递,一次性完成数据写入和流结束操作,避免时序问题:
const http2 = require('http2'); const arrayData = ['deb96c57-52ff-4ccb-9088-d421b1856724']; const arrayString = JSON.stringify(arrayData); const client = http2.connect('url'); // 替换为你的API主机地址 const request = client.request({ ':method': 'DELETE', ':path': '/path', // 替换为你的API端点 'content-type': 'application/json', 'content-length': Buffer.byteLength(arrayString), }); request.on('response', (headers, flags) => { let responseData = ''; request.on('data', (chunk) => { responseData += chunk; }); request.on('end', () => { console.log('Response:', responseData); }); }); request.on('error', (error) => { console.error('Error:', error); }); // 直接通过end()传递请求体,合并写入与结束操作 request.end(arrayString); client.on('close', () => { console.log('Client session closed.'); });
额外注意事项
- 即使HTTP2支持DELETE带请求体,仍需确认服务端是否接受该方式,部分REST规范的服务端实现可能会忽略或拒绝DELETE请求的请求体;
- 确保
content-length头部的值与请求体的实际字节长度完全匹配,避免因长度不匹配导致服务端解析错误。
内容的提问来源于stack exchange,提问作者Shreyas Murali
相关产品推荐
相关产品推荐

