标准答案
- UTF-8 一个字符可能占多个字节,不能把任意 Buffer 分片直接当作完整字符串拼接。
- 网络协议要按字节长度、分隔符或 framing 解析,不能只按一次 data 事件判断完整消息。
- Buffer.slice/subarray 可能共享底层内存,修改视图会影响原 Buffer;需要独立数据时使用 copy。
- 处理外部输入要限制长度,避免大 Buffer、编码转换和拼接造成内存压力。
题目解析
Buffer 表示字节,字符串表示按编码解释后的文本;UTF-8 字符可能跨多个字节,任意网络 chunk 也可能在一个字符或协议帧中间截断。解析应在字节层累计到完整 framing 后再解码。
Buffer.subarray/slice 可能共享底层内存,修改视图会影响原数据;需要隔离时使用 copy。上传、解码和拼接还要按字节限制长度,防止内存和 CPU 被输入放大。
协议应明确长度字段、分隔符、最大帧和异常处理。一次 data 事件不是消息边界,网络、文件和 TLS 都可能拆分或合并数据。
常见误区
- 误区:假设一个 data 事件就是一条消息。改正:按协议 framing 组装完整消息,并设置最大长度。
- 误区:用字符串长度校验上传字节数。改正:按 Buffer 字节数和解码后的协议字段分别限制。
- 误区:把 Buffer 视图当作深拷贝。改正:需要独立数据时调用 copy,并明确共享内存生命周期。