症状
这个错误异常地“乐于助人”,因为它把两个摘要都打印出来了:EINTEGRITY 附带 wanted 与 found 的 sha512 值。可能的责任方有三:本地缓存(返回了损坏字节)、registry 来源(下发了不同字节)、锁文件(记录了错误期望值)。判定方法是从官方 registry 直接拉取该 tarball 自行哈希:与锁文件一致说明是本地损坏,不一致说明镜像改动了产物。单机或单个 CI runner 失败、其他人正常,是本地缓存的典型形态。
诊断思路
先从报错中读出期望与实际摘要;再直接向官方 registry 请求 tarball 计算 sha512 定责;最后检查缓存状态与配置层级。npm config get registry 可能有项目、用户、全局三层 .npmrc 叠加覆盖,企业镜像的陈旧配置常藏在用户级文件里。锁文件被手工编辑或由非 npm 工具生成,会让期望值本身错误,表现是所有环境一致失败。
根因
npm 将锁文件里的 sha512 与实际取回的 tarball 做比对。损坏的缓存条目、镜像改动的产物或被修改的 integrity 字段都会让比对失败,npm 拒绝安装——这是安装链路里唯一的防篡改保护在起作用,而不是误报。
修复与验证
本地损坏时执行 npm cache verify 报告坏条目、npm cache clean –force 重建缓存,再删 node_modules 用 npm ci 全新安装。镜像问题时追查 registry 实际指向,删除或修正 .npmrc 里的镜像覆盖,修正代理与 DNS 规则。锁文件被改坏就从可信 registry 重新生成并提交。验证时在故障机器上强制全量拉取,零完整性错误即证明缓存干净;再做个机制验证:在沙盒副本里故意损坏一个缓存 tarball,确认 npm 依然报 EINTEGRITY——防护必须仍然在岗而不是被绕过;最后在第二个 CI runner 重复完整安装,证明修复可复现。绝不要用禁用完整性校验的配置换安装通过,那等于拆掉安装链路唯一的防篡改防线。
代码示例
npm ERR! code EINTEGRITY
npm ERR! sha512-integrity checksum failed when using sha512:
wanted: sha512-ZX/...9fA
found: sha512-k4/...2eQ
npm cache verify # reports corrupted entries
npm cache clean --force
rm -rf node_modules package-lock.json.bak
npm ci
npm config get registry
npm config delete registry # or fix .npmrc to the intended mirror