记一次错误“net::ERR_INCOMPLETE_CHUNKED_ENCODING”

  1. 前端找我: qa环境(老)能用 dev环境(新)不能用。好像是个跨域问题.
    具体表现为发送了个 option后,不继续发post了

  2. 没多想,看了下代码。感觉不应该是个跨域问题。不过还是改成了allow *

  3. 改了后没用

  4. 感觉是代码问题,因为老环境OK,新环境不行。然而同样代码的另一个新环境又可用???

  5. 想到可能是前端问题,于是看console,发现报错:

    failed to load resource net::err_incomplete_chunked_encoding chrome

  6. 百度, 各种千奇百怪的答案,nginx磁盘满了、chrome的自身问题、tomcat版本问题…

  7. 还是觉得应该是后端问题,认定应该是新老环境之间web的一些配置变化导致。

  8. compare两个分支的代码。发现web.xml新加了filter。于是去掉filter

  9. 问题解决

  10. 追踪问题.本地调试,发现是之间已经发现的坑.就是字符集编码的问题

1.new String(charArrayWriter.toCharArray()).getBytes();

//这句代码如果byte没有指定编码,而且是中文,则会报错String index out of range -1.
2.Map respMap = JSON.parseObject(responseCopier.getBytes(), Map.class);

改:

    public byte[] getBytes() {
        try {
            return new String(charArrayWriter.toCharArray()).getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
            return new String(charArrayWriter.toCharArray()).getBytes();
        }
    }

问题解决.


总结

遇到过N多次小问题,各种迷,但最后99%基本上都是后端埋的BUG。
因此遇到BUG没第一时间找到问题,还是要多从后端代码定位!

### 可能的原因 `net::ERR_INCOMPLETE_CHUNKED_ENCODING` 错误通常表示客户端接收到的数据流未按预期完成传输。当使用 `fetchEventSource` 进行 Server-Sent Events (SSE) 请求时,这种错误可能是由于服务器未能正确结束响应或者中间件(如 Nginx)在处理分块编码时出现问题所致[^1]。 以下是可能导致该问题的具体原因: 1. **Nginx 缓冲区设置不当**:如果 Nginx 的代理缓冲区大小不足以容纳 SSE 数据流,则可能会截断数据流并引发此错误[^4]。 2. **服务器端代码逻辑问题**:如果服务端未能正确发送完整的 HTTP 响应头或意外终止了连接,也可能导致此类错误[^3]。 3. **网络不稳定**:在网络质量较差的情况下,部分数据包可能丢失,从而造成不完整的数据流[^5]。 4. **Gzip 压缩冲突**:启用 Gzip 压缩功能后,某些情况下会干扰分块编码的正常工作。 --- ### 解决方案 #### 方案一:调整 Nginx 配置 可以通过修改 Nginx 配置来适应 SSE 流式传输的需求。具体参数如下: ```nginx http { ... proxy_buffering off; proxy_cache off; location /your-sse-endpoint/ { proxy_set_header Connection ''; proxy_http_version 1.1; chunked_transfer_encoding on; # 调整缓冲区大小以支持大流量 SSE 数据 proxy_buffer_size 4096k; proxy_buffers 16 4096k; proxy_busy_buffers_size 8192k; proxy_temp_file_write_size 8192k; } } ``` 以上配置禁用了代理缓冲机制 (`proxy_buffering`) 和缓存 (`proxy_cache`),确保数据能够实时传递给客户端而不被截断。 #### 方案二:检查服务端实现 验证服务端是否按照标准实现了 SSE 协议。以下是一个典型的 Node.js 实现示例: ```javascript app.get('/events', function(req, res) { res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); const sendEvent = () => { try { res.write(`data: ${JSON.stringify({ time: new Date().toISOString() })}\n\n`); } catch (e) { console.error(e); clearInterval(intervalId); // 清除定时器以防内存泄漏 } }; const intervalId = setInterval(sendEvent, 1000); req.on('close', () => { clearInterval(intervalId); }); }); ``` 注意以下几点: - 设置正确的 MIME 类型为 `text/event-stream`; - 添加必要的头部字段防止缓存; - 确保每次消息都以 `\n\n` 结束。 #### 方案三:排查网络与压缩设置 1. 如果启用了 Gzip 压缩,请考虑将其关闭或将特定路径排除在外: ```nginx gzip_types text/plain application/json; gzip_disable "msie6"; location /your-sse-endpoint/ { gzip off; } ``` 2. 检查是否有防火墙或其他设备拦截了长连接请求,并适当放宽限制条件。 #### 方案四:客户端重试机制 即使解决了大部分潜在问题,在极端条件下仍可能出现短暂掉线情况。因此建议加入自动重连逻辑: ```javascript const eventSource = new EventSource('/events'); eventSource.onerror = function(event) { console.log('Error occurred:', event); setTimeout(() => { console.log('Attempting reconnect...'); eventSource.close(); initEventSource(); // 自定义函数用于重新初始化连接 }, 5000); // 延迟 5 秒后再尝试恢复链接 }; ``` --- ### 总结 通过合理调整 Nginx 参数、完善服务端协议遵循度以及增强客户端鲁棒性可以有效缓解甚至彻底消除 `net::ERR_INCOMPLETE_CHUNKED_ENCODING` 错误的发生概率。实际操作中需结合具体情况逐一测试上述措施直至找到最佳组合方式。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值