尝试 运行 npm install 或 yarn 时出现 Zlib 错误

Zlib error when attempting to run npm install or yarn

我刚刚从 GitHub 的图书馆中提取了一些内容,我正在使用我的 windows 计算机在 VSCode 中进行编码。代码没有问题,尽管当我尝试 运行 npm install 或 yarn install 来获取 node_modules 和 yarn.lock 时,我收到了一个奇怪的错误并且软件包无法正常工作。我正在使用 ZSH 作为 Mac.

的终端 这是错误输出:

niltonsf@Niltons-MacBook-Pro ignews.nosync % sudo yarn install
Password:
yarn install v1.22.15
[1/4]   Resolving packages...
[2/4]   Fetching packages...
error An unexpected error occurred: "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz: incorrect data check".
info If you think this is a bug, please open a bug report with the information provided in "/Users/niltonsf/Desktop/ignews.nosync/yarn-error.log".
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
error https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-11.1.2.tgz: incorrect data check
error https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-11.1.2.tgz: incorrect data check
niltonsf@Niltons-MacBook-Pro ignews.nosync % npm install
npm WARN deprecated @types/next-auth@3.15.0: This is a stub types definition. next-auth provides its own type definitions, so you do not need this installed.
npm WARN deprecated querystring@0.2.1: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
npm WARN deprecated querystring@0.2.0: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
npm ERR! code Z_DATA_ERROR
npm ERR! errno -3
npm ERR! zlib: incorrect data check

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/niltonsf/.npm/_logs/2021-10-05T15_44_51_340Z-debug.log
niltonsf@Niltons-MacBook-Pro ignews.nosync % 

我在 node、npm 和 yarn 上的版本:

node: v14.18.0
npm: 6.14.15
yarn: 1.22.15
macos: Big Sur

我尝试过的:

deleting the yarn.lock
running: npm cache verify and then npm cache clean --force

这是日志结果的结尾:

1165 verbose stack     at PassThrough.Writable.write (internal/streams/writable.js:303:10)
1165 verbose stack     at PassThrough.ondata (internal/streams/readable.js:731:22)
1165 verbose stack     at PassThrough.emit (events.js:400:28)
1166 verbose cwd /Users/niltonsf/Desktop/github.nosync/ignews
1167 verbose Darwin 20.6.0
1168 verbose argv "/usr/local/Cellar/node@14/14.18.0/bin/node" "/usr/local/opt/node@14/bin/npm" "install"
1169 verbose node v14.18.0
1170 verbose npm  v6.14.15
1171 error code Z_DATA_ERROR
1172 error errno -3
1173 error zlib: incorrect data check
1174 verbose exit [ -3, true ]

如果我 运行 我的 windows 计算机中的 npm i 或 yarn 我没有收到任何错误

在我们的一些工作站上遇到类似问题后,我会说它肯定看起来像节点 14 中的错误。18.x 在 m1 Macs and/or Big Sur 上(即使 node 本身是为 x86_64) 编译的。我怀疑 zlib 库存在链接问题,但这是对 Node 问题跟踪器的讨论...

所以这是我的建议:卸载 Node 14。18.x 并尝试改用 Node 14。17.x。

附带说明一下,您可能会发现先安装 nvm 很有用。 nvm 允许快速安装多个版本的 Node,并从一个版本切换到另一个版本。例如,您可以这样做:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash

nvm install 14.17
nvm alias default 14.17

npm install -g yarn
yarn

我的项目不是 运行 在新的 Node.js 上,但我在我的 M1 笔记本电脑上的节点 14 上安装 dep 时也遇到了同样的问题。切换到 Node 14.17、14.16 没有帮助。

以下是我针对 m1 用户的解决方法:

nvm use 16
npm i --force
nvm use 14
npm run start // <- your app start command

切换到 Node 14.17、14.16 可能对您不起作用,因为新的基于 Apple M1 ARM 的 CPU 架构在 Node v16 之前一直不在支持路径中。这是来自工作站上已安装 NVM 的旧版本 NodeJS 的 M1/Apple Silicon/ARM 处理器的适当解决方案。

// Clear your current local NVM cache.
nvm cache clear

// Download and install NodeJS version 16, later verify that the v16
// NodeJS API does not break your applications build/runtime. 
nvm install v16 && nvm use v16 && node --version

// While at your projects root (same level as package.json, node_modules, typically)
// remove all traces of ./node_modules from last version's NPM & Node cache and node_modules directory.
rm -rf ./node_modules && npm cache clean --force

// All prior dependencies are now removed, reinstall with new NodeJS/NPM versions.
npm i

// Start your app
npm start 

Any global modules installed with NPM are going to get blown away when you switch into a new NodeJS version with NVM, as always. Therefore, make sure your project is not missing any required global/system NodeJS dependencies, installed at the machine level, which may or may not be included in your project's package.json file as a dependency or dev-dependency (@angular-cli, create-react-app, typescript, ts-node, express-generator, AWS-CLI, etc.)

如果你得到 运行time error's due to out-of-support dependencies, deprecated API changes from the migration from v14->v16(你的 NodeJS 项目越大,越有可能与您的代码库相关的重大更改)。如果在本地冒烟测试后 运行 似乎与 NodeJS v16 配合得很好,并且这不是您的个人项目,那么明智的做法是与您的领导、经理或架构师讨论提出拉取请求并获得在更改到位后完成全面回归,因为这将有可能导致回归以访问已弃用或不正确的签名以调用过时的 APIs.

Warning: If you get an error about NodeJS/NPM not being found, after downloading and switching versions be sure to reload your shell env, by exiting and opening manually or programmatically, depending on your local setup:

    // Bash with ~/.bash_profile for interactive shell
    source ~/.bash_profile

    // Bash reload from .bashrc non-interactive shell
    source ~/.bashrc

    // ZSH reload from .zshrc non-interactive shell
    source ~/.zshrc 

    // ZSH reload from ~/.zsh_profile for interactive shell
    source ~/.zsh_profile

    // Or just simply type the following into your shell, depending on which you are using.
    %> zsh
    #> sh 
    #> bash
 

**总结:目前推荐的方式是安装和使用推荐版本的NodeJS(v16),这是Apple M1 ARM官方支持的版本CPU.

这样一切都可以测试,您和维护代码库的任何其他开发人员都可以充分利用 v16 中的所有新功能和修复,并通过强制他们 运行 来防止浪费开发时间hacky 设置,尝试 hacky 解决方法。 这样一切都可以彻底测试。

Note: Eventually, someone will need to upgrade the NodeJS runtime version in order to stay in your support path and use modern dependencies, security/performance fixes, and leverage modern APIs, and target the latest supported JavaScript versions. If you are working with a team of developers who are working on different types of workstations, then this problem will be eating up development time while the research (and come to this post or figure out their own workaround, either may be dangerous and lead to uncommon, hard to trace/debug errors and an inconsistent development environment, instead of just fixing the build/runtime/dependency upgrade/replacements needed if issues occur when migrating to v16).

我开始在 M1 上使用任何节点 v14 时遇到相同的错误 mac

npm ERR! code Z_DATA_ERROR
npm ERR! errno -3
npm ERR! zlib: incorrect data check

尝试了很多东西,这对我有用:

安装原生支持 M1 的节点 v16 macs
这可能是您唯一需要做的事情...

但我需要做一些项目,每个人都在使用 node v14 和 npm v6
对我有用的是将节点 16 与降级的 npm 一起使用:

  1. 为此安装一个单独的节点版本:nvm install v16.13.1
  2. 切换到它并降级 npm:npm i -g npm@6.14.16
  3. 可选的别名:nvm alias compat v16.13.1

最后你应该有这样的东西:

nvm use compat 
Now using node v16.13.1 (npm v6.14.16)

对我来说,v16 的唯一问题是它更改了旧项目上的 package-lock.json 版本。


我试过但不起作用的方法

其他没有运气的节点 v14 版本(同样的错误)

  • v14.17.4
  • v14.17.6
  • v14.18.2

尝试在 v14 上升级 npm

尝试安装 npm@6.14.16 itelsef 导致 zlib 错误

npm doctor

说一切都很好

npm cache clean -f

之后出现同样的错误

转到一个新文件夹并开始一个新项目。

安装一些包成功了,但是在我的另一个项目中尝试安装一个出现 zlib 错误的包在新项目中导致了同样的错误

已删除node_modules

同上。一些软件包设法安装但不是全部 (zlib)


有趣的事实:
在 M1 mac 上安装低于 v16 的任何节点版本正在本地编译并向 nvm 缓存添加大约 10GB (https://github.com/nvm-sh/nvm/issues/2418)

除非您计划删除和安装(完全)相同的节点版本,否则不会再次使用此缓存

你可以用nvm cache clear把space拿回来

安装节点 v14.17.4 后的 nvm 缓存

对于那些使用带有 m1 芯片的 macbook 的人,我遇到了这个问题并尝试使用 nvm 安装以下节点版本,但错误仍然存​​在:

  • v14.5.5
  • v14.16.0
  • v14.16.1
  • 14.17.6

我尝试了清理缓存和这里提到的所有解决方案,我什至尝试了节点和 npm 的不同组合,但没有成功。

为了解决这个问题,我不得不 运行 命令来切换架构: arch -x86_64 zsh

在那之后,我可以毫无问题地进行 npm 安装。

npm ERR! code Z_DATA_ERROR
npm ERR! errno -3
npm ERR! zlib: incorrect data check

如果您的开发环境绝对需要较低版本的 Node

  • Apple M1 ARM-based 和 Node v12 是必须的

对我来说,问题始于 nvm,所以我不得不从那里开始,但我设法使用 this NVM troubleshooting guide 修复了它,并最终能够 npm 安装我的依赖项。在 shell:

中执行此操作
  1. 使用 $ arch
  2. 验证您是否在 arm64 中
  3. 安装 Rosetta $ softwareupdate --install-rosetta
  4. 更改架构 $ arch -x86_64 zsh(将 zsh 更改为您正在使用的 shell)
  5. 来源 nvm $ source "${NVM_DIR}/nvm.sh"
  6. 安装您需要的任何旧版本节点$ nvm install v12.22.1 --shared-zlib

"Note: You're probably curious why --shared-zlib is included. There's a bug in recent versions of Apple's system clang compiler. If one of these broken versions is installed on your system, the above step will likely still succeed even if you didn't include the --shared-zlib flag. However, later, when you attempt to npm install something using your old version of node.js, you will see incorrect data check errors. If you want to avoid the possible hassle of dealing with this, include that flag. For more details, see this issue and this comment" 6. Exit back to your native shell

$ exit
$ arch
arm64
  1. 验证您的节点架构是否正确。
$ node -p process.arch
x64
  1. 删除后我能够 npm install
  • /node_modules
  • package-lock.json 个文件。