接口偶发返回一段乱码 JSON,里面夹着别人的手机号和订单号。并发压到 50 就能复现,单请求怎么测都是干净的。乍看像缓存或者权限的锅,追下去往往不是。
const buf = Buffer.allocUnsafe(64); buf.fill(0); const out = Buffer.concat([buf.subarray(0, n)]); console.log(out.length === n);
追下去是这么回事:allocUnsafe 从预分配的 8KB 内存池里切一块,不做清零,上一位使用者留下的字节还在。只要拼接长度算错或者少写一段,尾部就会把残留内容一起吐出去。
碰到「allocUnsafe 内存残留」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。
具体做法是,对外输出一律用 Buffer.alloc 或 Buffer.from 明确长度;必须用 allocUnsafe 就紧接着 fill(0);检查拼接偏移 用 subarray 代替手算索引;返回前断言长度等于预期。
验收就看一点,并发 50 压十分钟 响应里不再出现非预期字符 长度校验一直是 true。
