Error message "error:0308010C:digital envelope routines::unsupported"

Error message "error:0308010C:digital envelope routines::unsupported"

我创建了默认的 IntelliJ IDEA React 项目并得到了这个:

Error: error:0308010C:digital envelope routines::unsupported
    at new Hash (node:internal/crypto/hash:67:19)
    at Object.createHash (node:crypto:130:10)
    at module.exports (/Users/user/Programming Documents/WebServer/untitled/node_modules/webpack/lib/util/createHash.js:135:53)
    at NormalModule._initBuildHash (/Users/user/Programming Documents/WebServer/untitled/node_modules/webpack/lib/NormalModule.js:417:16)
    at handleParseError (/Users/user/Programming Documents/WebServer/untitled/node_modules/webpack/lib/NormalModule.js:471:10)
    at /Users/user/Programming Documents/WebServer/untitled/node_modules/webpack/lib/NormalModule.js:503:5
    at /Users/user/Programming Documents/WebServer/untitled/node_modules/webpack/lib/NormalModule.js:358:12
    at /Users/user/Programming Documents/WebServer/untitled/node_modules/loader-runner/lib/LoaderRunner.js:373:3
    at iterateNormalLoaders (/Users/user/Programming Documents/WebServer/untitled/node_modules/loader-runner/lib/LoaderRunner.js:214:10)
    at iterateNormalLoaders (/Users/user/Programming Documents/WebServer/untitled/node_modules/loader-runner/lib/LoaderRunner.js:221:10)
/Users/user/Programming Documents/WebServer/untitled/node_modules/react-scripts/scripts/start.js:19
  throw err;
  ^

这似乎是最近的问题 - webpack ran into this 4 days ago and is still working on it.

Failed to construct transformer: Error: error:0308010C:digital envelope routines::unsupported

解决上述错误最简单易行的方法是将 Node.js 降级到 v14.18.1。然后只需删除文件夹 node_modules 并尝试重建您的项目,您的错误必须得到解决。

现在有两个选项-

1.尝试卸载 Node.js 版本 17+ 并重新安装 Node.js 版本 16+

2。打开终端并按照说明粘贴这些内容:

Linux & Mac OS (windows git bash)-

export NODE_OPTIONS=--openssl-legacy-provider

Windows命令提示符-

set NODE_OPTIONS=--openssl-legacy-provider

引用link.

在您的 package.json 中:更改此行

"start": "react-scripts start"

"start": "react-scripts --openssl-legacy-provider start"

如果我们使用 Node.js 的当前 LTS 版本,则不会出现此错误。将您的 Node.js 版本降级到当前的 LTS 版本 (16.13.0)。

可以通过多种方式安装所需的版本。其中之一是使用 nvm(Node.js 版本管理器)。

我在 Docker 构建中遇到了这个问题,我在 Docker 文件中添加了这一行:

RUN export NODE_OPTIONS=--openssl-legacy-provider && yarn build && yarn install --production --ignore-scripts --prefer-offline

对于本地开发,在文件package.json.

中添加开关

这是 Node.js 版本。

我在 Node.js 17 上遇到了这个错误,但是当我使用 nvm.

将我的 Node.js 版本切换到旧版本 (16) 时,一切正常

尝试:

npm create react-app --template typescript foo --use-npm

如果您遇到此错误并且不想更改主要配置,则可以使用以下方法轻松解决。不过,我不确定是否建议将其作为一种好的做法。

欢迎指正。

最初,假设这是我的 package.json 文件的脚本部分:

...
"version": "1.0.0",
  "scripts": {
    ...
    "build": "npm run build:test-app:testing",
    "build:test-app:testing": "ng build test-app --deploy-url  https://test-app.com/ --configuration=test-config",
    ...
  },
  "private": true,
...

要使用此 export NODE_OPTIONS=--openssl-legacy-provider 您可以执行以下操作:

"version": "1.0.0",
  "scripts": {
....
    "build": "NODE_OPTIONS=--openssl-legacy-provider npm run build:test-app:testing”,
    "build:test-app:testing": "NODE_OPTIONS=--openssl-legacy-provider ng build test-app --deploy-url  https://test-app.com/ --configuration=test-config"
...
  },
  "private": true,

记下构建脚本。我添加了一个选项:NODE_OPTIONS=--openssl-legacy-provider

这有助于解决 Node.js 版本 17 中的错误。

对于那些可以灵活更改构建系统 Node.js 版本的用户,只需切换到低于 17 的版本,例如版本 16。

对于Docker,最初使用这个的用例,始终拉取最新版本:

...
FROM node:alpine
...

您可以切换到类似的内容:

...
FROM node:16-alpine3.12
...

我在 GitHub 上找到了以下命令:

对于Windows,在cmd中使用以下命令:

set NODE_OPTIONS=--openssl-legacy-provider

对于 Unix,使用:

export NODE_OPTIONS=--openssl-legacy-provider

我在使用 Node.js 17.0.1 时遇到了同样的问题。我按照以下步骤解决了它:

  • 打开控制面板程序和功能Node.js 并通过右键单击 a

    卸载 Node.js
  • 前往网站https://nodejs.org/en/下载版本并安装。

这个解决方案对我有用。

此错误出现在 Node.js 版本 17+ 中,因此请尝试降级 Node.js 版本。

  1. 从计算机中卸载 Node.js。
  2. 下载 Node.js 版本 16 并从 https://nodejs.org/download/release/v16.13.0/
  3. 重新安装

就这些了。

这对我有用(从 Node.js 17 降级到 Node.js 16):

nvm install --lts
nvm use --lts

使用 Node.js Version Manager (for Windows).

在 Dockerfile 上你应该添加:

ENV NODE_OPTIONS=--openssl-legacy-provider

转到:https://nodejs.org/en/

并为大多数用户下载推荐版本。

然后从您的 PC 上卸载 Node.js 并安装 推荐的 版本。

据我了解,这是开发团队的问题。他们会尽快修复它,但同时使用推荐的版本,一切都会好的。

部分热门答案无效。

export NODE_OPTIONS=--openssl-legacy-provider

一些热门答案不适用,正在修改 package.json 文件:

"start": "react-scripts --openssl-legacy-provider start"

这是由 OpenSSL 的最新 node.js V17 兼容问题引起的,请参阅 GitHub 上的 this and this 问题。

最简单的事情就是从 node.js V17 降级到 node.js V16。请参阅 了解如何降级 node.js

我今天遇到了这个问题,并通过使用“nvm”切换 Node.js 版本解决了这个问题。

我一直在使用 Node.js、Next.js, and React 进行几个个人项目...我经常遇到的情况是我不记得 [=19 的确切版本=] 我用在哪个项目上。

所以通常我会尝试将 Node.js 16 用于当前使用 Node.js 14 的项目(我目前使用 Node.js 17)。

我还没有找到更好的方法来记住每个项目的 Node.js 版本,所以我通常只保存 运行 启动应用程序所需的所有命令readme.MD.

在终端 (OS X) 中,只需像这样降级:

sudo n 16.13.0

这在我的应用程序博览会中对我有用(从 Node.js 17 降级到 Node.js 12 或 14)。

如果你安装了 nvm,你可以更改节点的版本:

首先检查 nvm 中 Node.js 的版本:

nvm list

其次,安装12或14版:

nvm install v12.22.8

检查

node -v
v17.4.0

然后回滚到 node --lts (node v16.13.2 (npm v8.1.2)) 使用 nvm

official install nvm

对于 bash shell

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

对于 zsh shell

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | zsh

安装 nvm 之后

nvm install --lts

检查

 node -v 

v16.13.2

重试

Angular.io项目中,Nodes.js的接受(不受支持)版本是v16.x.x.

Nodes v17.x版本中,出现与本题描述相同的错误。

解法:

卸载节点并重新安装版本v16.x(对于Windows)。

已使用 lts

修复
echo "lts" > .nvmrc
nvm install

如果您使用的是 react-scripts,您现在只需升级到似乎已解决此问题的 5.0.0 版(或更高版本)即可 (it includes a newer version of webpack)。

您需要更新react-scripts到最新版本

npm update react-scripts --save

如果您在使用 GatsbyJs 时遇到此错误,您需要做的就是将 node 版本降级到 long-term 支持.别无他法

这可能不是每个人问题的答案。但是对于 运行 节点 17 及以上 docker 的任何人来说,正如大家所说的那样降级会有帮助。不需要 open-legacy-sslprovider。在您的 Dockerfile 中使用

进行简单切换
From node

使用

From node:16.* 

修复了 docker 中的这个问题。

运行 审核为我解决了问题

npm audit fix --force

对于 Angular 应用: 您也可以在 package.json 中编辑 'npm start' 脚本而不是

"start": "ng serve -o"

"start": "set NODE_OPTIONS=--openssl-legacy-provider && ng serve -o"

所以每次当你 运行 在 terminal/command 行 npm start 它会首先设置 NODE_OPTIONS 来避免这个问题。

与节点版本 v18.0.0 相同的错误 和 nuxt 框架版本 2.15 当 运行 开发服务器并且将被修复:

"scripts": {
  "dev": "NODE_OPTIONS=--openssl-legacy-provider nuxt"
}

在使用 VueJS 时遇到这个问题。

使用 -openssl-legacy-provider 的缺点是它不受旧节点版本的支持。提供此标志时,较旧的 Node 版本根本不会 运行。
但我仍然希望与 Node v16 及更早版本兼容。

VueJS 使用 md4 算法生成哈希值(实际上它是 WebPack 的底层)。 md4 可以很容易地替换为 md5 用于此类目的。使用的算法类型在大多数地方都是硬编码的,因此无法配置另一种算法。

所以我想到了另一个解决方法。拦截来自 crypto 模块的原始 createHash() 调用并将其替换为修改版本的函数。这是我的 vue.config.js 文件的开头:

const crypto = require('crypto');

/**
 * md4 algorithm is not available anymore in NodeJS 17+ (because of lib SSL 3).
 * In that case, silently replace md4 by md5 algorithm.
 */
try {
  crypto.createHash('md4');
} catch (e) {
  console.warn('Crypto "md4" is not supported anymore by this Node version');
  const origCreateHash = crypto.createHash;
  crypto.createHash = (alg, opts) => {
    return origCreateHash(alg === 'md4' ? 'md5' : alg, opts);
  };
}

原因:

这个错误是因为node.js17使用了OpenSSL3,它改变了md家族(包括md4)的初始化上下文的代码,这是一个破坏性的变化。 如果您使用 docker build 构建应用程序,也会发生该错误,因为它默认会提取最新版本的 Node.JS。

安装 nvm 节点版本管理器:

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

安装最新的 LTS 版本:

nvm install --lts

使用 LTS 版本:

nvm use --lts

完成!

来源:https://itsmycode.com/error-digital-envelope-routines-unsupported/