V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
imherer
V2EX  ›  程序员

前后端的大佬们帮忙看看,最近遇到个奇葩问题

  •  3
     
  •   imherer · 2 天前 · 5598 次点击

    有几个数据量比较大( 57kb 左右)的 api 在 chrome 浏览器下偶尔会报错如下:

    GET http://localhost:3000/api/v1/xxx net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK)
    

    这里的 3000 是 vite 的端口,对应的后端端口是 4000 。

    复现场景

    • PC 版 chrome 通过 vite 代理访问后端 api (版本 133.0.6943.99 )

    已尝试过且正常的场景

    • PC chrome 直接访问后端 api 正常
    • PC edge 直接访问后端 api 正常
    • PC edge 通过 vite 代理访问后端 api 正常
    • PC firefox 直接访问后端 api 正常
    • PC firefox 通过 vite 代理访问后端 api 正常
    • Mac chrome 直接访问后端 api 正常
    • Mac chrome 通过 vite 代理访问后端 api 正常
    • PC chrome 访问线上环境 正常
    • 用同事电脑访问 vite 代理 api 也是正常的

    怀疑是不是 chrome 哪里设置不对,但是最近也没改动过设置,我还把 chrome 上所有的扩展都禁用了

    之前没有任何问题,最近也没改动过代码,也没升级过依赖库,发现问题是因为我更新了 GoLand ,然后重启了电脑就出现这个问题了。

    最开始以为是 GoLand 版本导致的,我尝试过不用 GoLand 启动后端程序GoLand 降级为之前版本,问题依旧

    前后端分离的方式,后端是用 Go+Gin,前端是 Vue3+Vite5.2.6 ,本地开发的时候 vite.config.ts 里的 server 配置如下

     proxy: {
            "/api/v1": {
              target: "http://localhost:4000",        
              ws: true,          
              changeOrigin: true,
            },
          }
    
    第 1 条附言  ·  2 天前
    添加了一个最小的复现仓库,有兴趣的大佬可以试试,看能复现吗

    https://github.com/im-here/err-incomplete-chunked-encoding-reproduction
    91 条回复    2025-02-21 09:30:56 +08:00
    musi
        1
    musi  
       2 天前
    看看原始 go api 返回的 response header 和 vite api 返回的 response header
    imherer
        2
    imherer  
    OP
       2 天前
    @musi 原始 api 的:
    HTTP/1.1 200 OK
    Content-Type: application/json; charset=utf-8
    Date: Wed, 19 Feb 2025 02:00:08 GMT
    Transfer-Encoding: chunked

    vite 正常返回:
    HTTP/1.1 200 OK
    Access-Control-Allow-Origin: *
    content-type: application/json; charset=utf-8
    date: Wed, 19 Feb 2025 02:01:05 GMT
    connection: close
    transfer-encoding: chunked

    vite 报错返回:
    HTTP/1.1 200 OK
    Access-Control-Allow-Origin: *
    content-type: application/json; charset=utf-8
    date: Wed, 19 Feb 2025 02:01:42 GMT
    connection: close
    transfer-encoding: chunked
    timedivision
        3
    timedivision  
       2 天前
    如果是 mac 的话,兴许是要在本地网络里面勾选上 chrome
    0900301432
        4
    0900301432  
       2 天前
    重启服务器
    0900301432
        5
    0900301432  
       2 天前
    我前几天也碰到这个问题,客户端弄了一遍没有好。 同事把服务重启了就好了
    imherer
        7
    imherer  
    OP
       2 天前
    @0900301432 #5 后端服务和前端现在都在我本机电脑上,尝试过重启还是不行
    imherer
        8
    imherer  
    OP
       2 天前
    @chobitssp 看着好像不是同一个问题。 而且我这个问题很奇葩,线上环境数据量比我本地的还大,已经的大于 57kb 了,访问也没这个问题
    Kokomashiro
        9
    Kokomashiro  
       2 天前
    看看有问题的电脑 c 盘空间是不是不够了,具体啥原因忘了
    chobitssp
        10
    chobitssp  
       2 天前
    @imherer 2 楼说了 The page would load normally if accessed in HTTPS mode
    如果线上是 https 就不会复现
    imherer
        11
    imherer  
    OP
       2 天前
    @chobitssp #10 线上确实是 https
    如果在本地我把前端打包后直接放在和后端服务里(相当于前后端都是同一个 host )的情况下用 chrome 访问也没问题
    imherer
        12
    imherer  
    OP
       2 天前
    @Kokomashiro 够的呢,c 盘还有 500g+
    Aolose
        13
    Aolose  
       2 天前
    node 版本是多少
    这里有个和版本相关的原因
    https://github.com/nodejs/node/issues/13677

    另外 vite 的 proxy 用的一个古老的 http-proxy 包,它也有嫌疑
    https://github.com/http-party/node-http-proxy/issues/921
    javalaw2010
        14
    javalaw2010  
       2 天前
    chunked 响应?可能是响应里没有正确的结束符,结尾需要额外传输 0\r\n\r\n 表示结束
    magewu1223ll
        15
    magewu1223ll  
       2 天前
    这个错误是数据在传输过程中服务器突然中断了,是不是在调试时,你的服务有什么热更新然后重启了?
    imherer
        16
    imherer  
    OP
       2 天前
    @Aolose node 版本是 v20.11.0

    关键是只有我电脑上的 chrome 有这个问题,我用别的浏览器或者别的电脑访问都没问题。
    imherer
        17
    imherer  
    OP
       2 天前
    @magewu1223ll 没有,就正常访问偶现,而且概率还挺高
    abc1310054026
        18
    abc1310054026  
       2 天前
    你可以尝试模拟下返回的数据,尝试返回不同大小的数据,看看是否报错。怀疑 chrome 对非安全数据大小有限制?
    imherer
        19
    imherer  
    OP
       2 天前
    @abc1310054026 目前有 3 个接口返回的数据量比较大,我尝试过把这 3 个接口都返回空就不会报错。 但是这 3 个接口也不是 100%报错,而且有一定概率会报错
    Timefly
        20
    Timefly  
       2 天前
    是不是搞了负载均衡之类的东西
    imherer
        21
    imherer  
    OP
       2 天前
    @Timefly 没有哦,就在我本地,一个后端
    abc1310054026
        22
    abc1310054026  
       2 天前
    建议换一台 PC 或者换个 chroome 版本试试,Chrome 其实没你想象的那么可靠,在一些边缘场景会有问题反反复复出现。

    可以用 browserstack 测试不同版本的浏览器。
    imherer
        23
    imherer  
    OP
       2 天前
    @abc1310054026 #22 感谢,我看看 browserstack
    rekulas
        24
    rekulas  
       2 天前
    遇到玄学问题可以尝试下玄式方案,比如换个端口?
    imherer
        25
    imherer  
    OP
       2 天前
    @rekulas 你说的有道理,我试试
    UnluckyNinja
        26
    UnluckyNinja  
       2 天前 via Android
    vite 5.2.6 有点老了,v5 现在最新是 5.4.14 ,试试更新下看看
    imherer
        27
    imherer  
    OP
       2 天前
    @UnluckyNinja 应该和这个关系不大,我有更到 6.0.9 还是同样的问题
    whoosy
        28
    whoosy  
       2 天前
    把 vpn 关掉
    imherer
        29
    imherer  
    OP
       2 天前
    @whoosy 不行哦,还是同样的问题
    xmdbb
        30
    xmdbb  
       2 天前
    關鍵字是 ERR_INCOMPLETE_CHUNKED_ENCODING
    UnluckyNinja
        31
    UnluckyNinja  
       2 天前 via Android
    @imherer #27 那感觉可以试试抓包比较一下到底有何区别?最好是前端到 vite ,vite 到后端都抓一下,对比正常的看看到底是 incomplete 在哪里😂
    Ly0n
        32
    Ly0n  
       2 天前
    这有一个 nginx 报相同错误 ERR_INCOMPLETE_CHUNKED_ENCODING 的解决方案
    https://juejin.cn/post/7096409076245987358
    看起来像是缓冲区的问题
    或者会不会是特定数据的问题
    imherer
        33
    imherer  
    OP
       2 天前
    @UnluckyNinja #31 嗯嗯
    Oldletter
        34
    Oldletter  
       2 天前
    你电脑有没有 web 防护的杀毒软件呢?
    imherer
        35
    imherer  
    OP
       2 天前
    @Oldletter 有个 McAfee ,它还自动给 chrome 装了个插件,我最开始也以为是它的问题,我把插件给关了。 软件没关,我去看看有没有什么设置
    alangc
        36
    alangc  
       2 天前
    试试下面三个方法呢:
    1. 关闭浏览器所有 3000 标签,只保留一个,测试下
    2. vite 启动命令加上 --force ,重启
    3. 删除 node_modules, 重新安装依赖,重启
    hackroad
        37
    hackroad  
       2 天前
    musi
        38
    musi  
       2 天前
    @imherer #2 仅有这些信息确实看不出来什么问题,如果有能力试试 wireshark 抓包,看看是服务的问题还是 node 得问题
    imherer
        39
    imherer  
    OP
       2 天前
    @alangc 不行噢
    mizuki9
        40
    mizuki9  
       2 天前
    chrome 设置里关掉 “预加载网页” ?
    kbqncf
        41
    kbqncf  
       2 天前
    既然是有概率出现,那么是不是服务端接口返回的数据有某种变化?

    能正常请求的时候,记录下接口返回的数据,然后服务端接口强制写死返回相同的数据,再多次测试接口看看是否正常。

    难道是接口数据里面有 emoji 或特殊字符?
    imherer
        42
    imherer  
    OP
       2 天前
    @kbqncf 没有 emoji 或特殊字符,就是纯字符串。现在只有在 chrome 下访问通过 vite 代理的端口 api 才会有问题,其他的浏览器或者直接访问后端的 api 就没问题。

    用 wireshark 抓包看了下当 chrome 出现错误的时候,抓包里的数据还是正常返回的
    cnbdas
        43
    cnbdas  
       2 天前
    https://github.com/chimurai/http-proxy-middleware/discussions/574
    可以看看这个移除 transfer-encoding 然后访问试试
    richardZhao
        44
    richardZhao  
       2 天前
    期待后续。
    UnluckyNinja
        45
    UnluckyNinja  
       2 天前 via Android
    楼主要不做一个 minimal reproduction 吧,服务器信息脱下敏、换成固定的假数据、前端最低限度内容,能复现报错就行,让大家在本地跑一跑,没准就有人 debug 出来了
    4Et5ShxMIq58n6Lr
        46
    4Et5ShxMIq58n6Lr  
       2 天前
    我今天本地开发的时候也遇到了,接口走代理的时候,也会出现这种情况,不过不是必现,时好时坏,不知道为啥,刷新一下页面又会正常
    huiguo19962023
        47
    huiguo19962023  
       2 天前
    真是巧了,我今天遇到类似的问题,代码没有任何改变。只是昨天晚上电脑强制断电了,今天重启服务重新打开谷歌浏览器就变成这样了,目前未定位问题。但是用火狐或者 edge 没有问题。所以排除代码的问题。
    imherer
        48
    imherer  
    OP
       2 天前
    @huiguo19962023 简直一模一样啊。我也是因为昨天更新了 GoLand 然后重启了电脑出现的
    imherer
        49
    imherer  
    OP
       2 天前
    @UnluckyNinja #45 晚点我弄一个能复现的 minimal reproduction 试试
    wangtian2020
        50
    wangtian2020  
       2 天前
    把 F12 里的禁用缓存打开
    imherer
        51
    imherer  
    OP
       2 天前
    @wangtian2020 开着的,而且尝试过清除浏览器缓存、无痕模式 都不行
    wangtian2020
        52
    wangtian2020  
       2 天前
    ws: true 是个什么
    后端真的是一个个懒狗,跨域不开,非要前端搞 proxy changeOrigin
    我看啊,是这个 websocket 分包了
    Zz09
        53
    Zz09  
       2 天前
    会不会返回的数据出现某个 chrome 不能识别的字符导致的
    SleepyRaven
        54
    SleepyRaven  
       2 天前
    https://stackoverflow.com/questions/29894154/chrome-neterr-incomplete-chunked-encoding-error
    杀毒软件的类似实时防护功能导致的,不限于 ESET 和卡巴斯基
    wangtian2020
        55
    wangtian2020  
       2 天前   ❤️ 1
    不用找原因了。
    原因就是因为你司后端是一个懒狗,不愿意在开发环境搞跨域请求头
    `Access-Control-Allow-Origin: *`
    所以你们前端就上了 vite 的 proxy 功能,把请求接口代理转发一下,
    避免这种因为接口地址跨域并且接口返回头并不是跨域。
    ws: true 说明用到了 websocket
    小请求没事,结果有一个请求太大了,57KB ,触发了 websocket 的分包 (注:分包粘包不是一个问题,而是一个现象)。触发了 bug ,一分包,夹断了
    wangtian2020
        57
    wangtian2020  
       2 天前
    建议趁着下班前,火速去跟后端 battle 去
    leokun
        58
    leokun  
       2 天前
    @wangtian2020 #57 他这个和 ws 没关系,作者发的响应头中有 Transfer-Encoding: chunked ,说明是分块传输。
    这个 HTTP 协议应该是作者的服务程序自带的,通过代理后,只有 chrome 在解码块的时候报错了
    kw8023cn
        59
    kw8023cn  
       2 天前
    @imherer #19 数据量大的时候超出了默认的连接等待时间,设置一下相应等待时间就好了
    wangtian2020
        60
    wangtian2020  
       2 天前
    @leokun 都解释的通的,websocket 分包这个机制,就是看网络层心情,大数据传输有时候分包有时候不分,这不就跟 OP 的有时没问题有时有问题,对上了吗。而且大数据量也对上了。他把 websocket 去掉。肯定就好了
    tcper
        61
    tcper  
       2 天前
    @wangtian2020 看作者的例子是 get 请求,不是 websocket
    myderr
        62
    myderr  
       2 天前
    没成功复现
    dishangyijiao
        63
    dishangyijiao  
       2 天前
    @imherer 拉下来,在本地没有复现。
    imherer
        64
    imherer  
    OP
       2 天前
    @myderr 看来真的是我电脑上 chrome 有问题了。目前这个只有在我电脑上的 chrome 能复现,而且概率还挺高的,基本上 10 次必现 1 次
    imherer
        65
    imherer  
    OP
       2 天前
    @dishangyijiao 感谢!
    dishangyijiao
        66
    dishangyijiao  
       2 天前
    @imherer 我是 Mac mini M4 ,Chrome Version 133.0.6943.98 (Official Build) (arm64)。
    imherer
        67
    imherer  
    OP
       2 天前
    @dishangyijiao #66 嗯,我昨天在 Mac 上也试了,未能复现 Chrome Version 133.0.6943.99
    leochenL
        68
    leochenL  
       2 天前
    我们内网的平台也出现了,也是只有在那个人电脑的 Chrome 上才会出现,没找出啥问题,让用 edge 了
    imherer
        69
    imherer  
    OP
       2 天前
    @leochenL 真的搞不懂是啥原因
    gsx250
        70
    gsx250  
       2 天前
    只在 chrome 下偶现?试试看是不是 chrome 的插件导致的。卸载完所有的插件,再重启 chrome 试试。
    再或者重新安装 chrome ,不要安装插件。
    imherer
        71
    imherer  
    OP
       2 天前
    @gsx250 是的,我倒是把所有插件都关了尝试过,不过没卸载
    gsx250
        72
    gsx250  
       2 天前
    @imherer #71 卸载试试,有些 chrome 插件回带来偶发魔法 bug🤣
    imherer
        73
    imherer  
    OP
       2 天前
    @gsx250 #72 嗯
    hailaz
        74
    hailaz  
       2 天前
    Windows chrome133.0.6943.127 (正式版本) ( 64 位)没有复现
    asdjgfr
        75
    asdjgfr  
       2 天前
    数据改为 5000000 的时候复现了,设置跨域不走 vite 的代理也这样,edge 和火狐没问题,估计是 chrome 的特殊 bug 吧
    版本 133.0.6943.98 (正式版本) ( 64 位)
    Sum0l
        76
    Sum0l  
       2 天前
    未能复现
    windwos chrome 版本 133.0.6943.126 (正式版本) ( 64 位)
    vscode 运行前后端
    frank553000
        77
    frank553000  
       2 天前
    我的也是,换端口,重启 php ,重新安装包都试了,暂时用 edge 了:
    版本 133.0.6943.127 (正式版本) ( 64 位)

    GET http://localhost:3000/wp-content/themes/xxx/assets/dist/css/app.css?ver=2de18c97299dd576c55d9a3468426371 net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK)

    GET http://localhost:3000/wp-content/themes/xxx/assets/dist/img/logo.png
    net::ERR_CONTENT_LENGTH_MISMATCH 200 (OK)

    GET http://localhost:3000/
    net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK)
    ZLY201
        78
    ZLY201  
       2 天前   ❤️ 2
    chromium 内核已知问题,本地走代理访问大页面会出现这个问题 -> https://issues.chromium.org/issues/391126826
    Aolose
        79
    Aolose  
       2 天前
    没有复现 设置到了 500000 条 除了会卡顿一下 ... 这是玄学吗

    Node v23.6.1
    Go go1.24.0 windows/amd64
    Chrome 133.0.6943.98 (Official Build) (64-bit)
    fuzzsh
        80
    fuzzsh  
       2 天前 via Android
    反复刷新才出现?看似是复用了连接,改成用完即弃?
    imherer
        81
    imherer  
    OP
       2 天前
    @fuzzsh 不一定是反复刷新才会出现。 有可能第一次请求就会出现
    Danswerme
        82
    Danswerme  
       1 天前
    我逐步加到 50,000,000 条,浏览器耗时八秒传输了 739 MB 数据,页面没能加载出数据条数,但是也没有复现这个问题。

    Node v22.13.1
    go version go1.23.6 windows/amd64
    Chrome 133.0.6943.127 (Official Build) (64-bit)
    DLOG
        83
    DLOG  
       1 天前
    看不出来,直接 wireshark 抓包看吧
    imherer
        84
    imherer  
    OP
       1 天前
    @DLOG 抓包对比了正常和错误的情况,返回的数据都是一模一样的
    morytyann
        85
    morytyann  
       1 天前
    根据 Chromium 的 Issue ,添加--disable-features=TcpSocketIoCompletionPortWin 到快捷方式的目标里即可。

    Issue 链接: https://issues.chromium.org/issues/391126826
    解决方法: https://issues.chromium.org/issues/391126826#comment15
    imherer
        86
    imherer  
    OP
       1 天前
    @morytyann 加了--disable-features=TcpSocketIoCompletionPortWin 还是不行
    zhaojun1998
        87
    zhaojun1998  
       1 天前
    也遇到了这个问题。。一开始以为浏览器某个插件导致的,然后换了 Edge 正常。看来真是谷歌浏览器的问题了。
    diyhi
        88
    diyhi  
       1 天前
    chrome 的问题,Edge 和 Firefox 都正常,chrome 用 http 访问就会报错 net::ERR_CONTENT_LENGTH_MISMATCH 200 (OK),https 正常
    lyj9768
        89
    lyj9768  
       22 小时 24 分钟前
    我也遇到了,昨晚手贱更新了 chrome 到 133 ,今天内网的页面时不时就加载不出来,换火狐正常。我记得之前好像说 chrome 会禁止没有 https 的访问,但是难道连本地的也禁止?
    july1995
        90
    july1995  
       12 小时 23 分钟前 via iPhone
    蹲一个后续,问题解决了 通知一下哈。😋
    imherer
        91
    imherer  
    OP
       11 小时 30 分钟前
    @july1995 从目前的情况来看应该是 chrome 的 feature 了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2763 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:01 · PVG 21:01 · LAX 05:01 · JFK 08:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.