标准答案

  1. UTF-8 一个字符可能占多个字节,不能把任意 Buffer 分片直接当作完整字符串拼接。
  2. 网络协议要按字节长度、分隔符或 framing 解析,不能只按一次 data 事件判断完整消息。
  3. Buffer.slice/subarray 可能共享底层内存,修改视图会影响原 Buffer;需要独立数据时使用 copy。
  4. 处理外部输入要限制长度,避免大 Buffer、编码转换和拼接造成内存压力。

题目解析

Buffer 表示字节,字符串表示按编码解释后的文本;UTF-8 字符可能跨多个字节,任意网络 chunk 也可能在一个字符或协议帧中间截断。解析应在字节层累计到完整 framing 后再解码。

Buffer.subarray/slice 可能共享底层内存,修改视图会影响原数据;需要隔离时使用 copy。上传、解码和拼接还要按字节限制长度,防止内存和 CPU 被输入放大。

协议应明确长度字段、分隔符、最大帧和异常处理。一次 data 事件不是消息边界,网络、文件和 TLS 都可能拆分或合并数据。

常见误区

  • 误区:假设一个 data 事件就是一条消息。改正:按协议 framing 组装完整消息,并设置最大长度。
  • 误区:用字符串长度校验上传字节数。改正:按 Buffer 字节数和解码后的协议字段分别限制。
  • 误区:把 Buffer 视图当作深拷贝。改正:需要独立数据时调用 copy,并明确共享内存生命周期。

作者信息