const wss = new WebSocketServer({ port: 8080, maxPayload: 1024 * 1024 });
ws.on('close', (code) => console.log('close', code));
上传一份 90KB 的 JSON 快照,连接立刻断开,onclose 拿到 code 1009 reason 是 Max payload size exceeded,同样的数据压到 60KB 就正常。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,ws 库的 maxPayload 默认值很大,但不少封装框架或网关自己压到了 64KB,超过就按协议回 1009 并断开。浏览器端不抛异常,只有 onclose 里能看到原因。
「1009 消息过大」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
处理上按这个顺序:先确认限制在哪一层 应用的 maxPayload 网关的 client_max_body_size 还是 CDN;能拆就拆 把大对象分成多条消息按 chunk 编号传;确实要发大包就调大上限 并同步改网关超时;客户端把 1009 单独提示 别当成掉线直接重连。
改完只确认一件事:90KB 的快照能完整收到 服务端解出对象 onclose 不再出现 1009。
