error:0308010C:digital envelope routines::unsupported

error:0308010C:digital envelope routines::unsupported

报错原因

error:0308010C:digital envelope routines::unsupported

出现这个错误是因为 node.js V17版本中最近发布的OpenSSL3.0, 而OpenSSL3.0对允许算法和密钥大小增加了严格的限制,可能会对生态系统造成一些影响.

node.js V17以前一些可以正常运行的的应用程序,但是在 V17 版本可能会抛出以下异常:

javascript 复制代码
node:internal/crypto/hash:67
  this[kHandle] = new _Hash(algorithm, xofLen);
                  ^

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.__webpack_modules__.57442.module.exports (/Users/workspace/React/umiapp/node_modules/@umijs/deps/compiled/webpack/4/bundle4.js:135907:62)
    at NormalModule._initBuildHash (/Users/workspace/React/umiapp/node_modules/@umijs/deps/compiled/webpack/4/bundle4.js:109317:16)
    at handleParseError (/Users/workspace/React/umiapp/node_modules/@umijs/deps/compiled/webpack/4/bundle4.js:109371:10)
    at /Users/workspace/React/umiapp/node_modules/@umijs/deps/compiled/webpack/4/bundle4.js:109403:5
    at /Users/workspace/React/umiapp/node_modules/@umijs/deps/compiled/webpack/4/bundle4.js:109258:12
    at /Users/workspace/React/umiapp/node_modules/@umijs/deps/compiled/webpack/4/bundle4.js:61157:3
    at iterateNormalLoaders (/Users/workspace/React/umiapp/node_modules/@umijs/deps/compiled/webpack/4/bundle4.js:60998:10)
    at Array.<anonymous> (/Users/workspace/React/umiapp/node_modules/@umijs/deps/compiled/webpack/4/bundle4.js:60989:4) {
  opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
  library: 'digital envelope routines',
  reason: 'unsupported',
  code: 'ERR_OSSL_EVP_UNSUPPORTED'
}

Node.js v17.0.1
✨  Done in 1.92s.

解决方案

方案一:降低node版本在17以下

看了一下错误堆栈,发现是一个Node的内核文件抛出来的错误,这个错误应该是和Node的版本有关(前几天刚刚升级过Node),降低Node的版本应该可以解决这个问题。或者使用nvm(Windows平台上也可以使用nvm-windows)安装多个不同的Node版本。

指定node版本 mac node版本降级 mac切换node版本

参考链接:https://blog.csdn.net/weixin_43770430/article/details/132420638

第一步 进行nvm 安装操作

javascript 复制代码
brew install nvm 

执行 nvm --version

javascript 复制代码
nvm --version 
javascript 复制代码
出现zsh: command not found: nvm问题去进行配置

第二步 nvm配置

1.输入: vim ~/.bash_profile

点击 i 进行插入操作 插入下面配置

javascript 复制代码
export NVM_DIR=~/.nvm
source $(brew --prefix nvm)/nvm.sh

插入完成后 点击Esc 然后 使用 :wq. 保存并退出

执行:

javascript 复制代码
source ~/.bash_profile

如果出问题先不管接着往下走

2.输入:vim ~/.zshrc

点击 i 进行插入操作 插入下面配置

javascript 复制代码
export NVM_DIR=~/.nvm
source $(brew --prefix nvm)/nvm.sh

插入完成后 点击Esc 然后 使用 :wq. 保存并退出

执行:

javascript 复制代码
source ~/.zshrc

3.输入: vim ~/.profile

点击 i 进行插入操作 插入下面配置

javascript 复制代码
export NVM_DIR=~/.nvm
source $(brew --prefix nvm)/nvm.sh

插入完成后 点击Esc 然后 使用 :wq. 保存并退出

执行:

javascript 复制代码
source ~/.profile
  1. 最后开始进行测试
    执行:
javascript 复制代码
nvm --version

显示版本号就说明配置成功:0.39.1

第三步 安装node指定版本 node版本降级

执行:

javascript 复制代码
nvm install v14.16.1

安装完成后检查

javascript 复制代码
node --version

注意!!:

  1. 如果iterm2 中进行brew isntall xxx 或者brew update ,brew doctor 出现 fatal: not in a git directory报错提示时
javascript 复制代码
fatal: not in a git director
No remote 'origin' in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-ser

解决方法

javascript 复制代码
 git config --global --add safe.directory /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core
	
git config --global --add safe.directory /usr/local/Homebrew/Library/Taps/homebrew/homebrew-services
	
git config --global --add safe.directory /usr/local/Homebrew/Library/Taps/homebrew/homebrew-caskgit 	
  1. mac 系统终端node版本跟vscode终端node版本不一致时
    在vscode终端上执行这行代码,关闭vscode,重启就可以了。
javascript 复制代码
nsudo rm -rf /usr/local/{lib/node{,/.npm,_modules},bin,share/man}/{npm*,node*,man1/node*}

方案二:启用legacy OpenSSL provider

除了切换Node的版本来解决这个问题外,其实还可以尝试启用legacy OpenSSL provider来解决这个问题,通过下面的命令行操作起来更容易:

Unix (Linux, macOS, Git bash等)

javascript 复制代码
export NODE_OPTIONS=--openssl-legacy-provider

Windows

javascript 复制代码
set NODE_OPTIONS=--openssl-legacy-provider

PowerShell

javascript 复制代码
$env:NODE_OPTIONS = "--openssl-legacy-provider"

方案三:配置package.json文件

另外一个方法是在项目的package.json文件里将

javascript 复制代码
"start": "react-scripts start"

Windows

替换成:

javascript 复制代码
"start": "react-scripts --openssl-legacy-provider start"

mac

替换成:

javascript 复制代码
"start": "export NODE_OPTIONS=--openssl-legacy-provider &&  react-scripts start"

亲测有效

拓展:package.json中的&&和&

原文链接:https://blog.csdn.net/weixin_56361614/article/details/134010076

package.json 文件中的 scripts 字段中,一条命令可以同时执行多个指令。

而指令间可以使用

  • &,例如:"start": "node app.js & nodemon"
  • &&,例如:"start": "node app.js && nodemon"
  • 不使用连接符,例如:"start": "node app.js nodemon"

三者区别:

一、&

& 符号:表示执行当前指令后立即执行下一个指令,不管上一个指令是否执行成功

javascript 复制代码
"scripts": {
  "start": "node app.js & nodemon"
}

当执行 npm run start 命令时,会先执行 node app.js 指令,然后立即执行 nodemon 指令,不管 node app.js 是否执行成功

二、&&

&& 符号:表示只有上一个指令执行成功后,才会执行下一个指令。

javascript 复制代码
"scripts": {
  "start": "node app.js && nodemon"
}

当执行 npm run start 命令时,会先执行 node app.js 指令,如果执行成功,则会执行 nodemon 指令;如果执行失败,则不会执行 nodemon 指令。

三、不使用连接符

如果在 package.json 文件中的 scripts 字段中不使用 & 和 && 符号来连接指令,那么默认情况下会按照顺序依次执行每个指令。

javascript 复制代码
"scripts": {
  "start": "node app.js nodemon"
}

当执行 npm run start 命令时,会先执行 node app.js 指令,然后执行 nodemon 指令。这里的 nodemon 实际上会作为 node app.js 的参数传递给它。

需要注意的是,如果某个指令执行失败(即返回非零的退出码),那么后续的指令将不会执行。因此,如果希望所有指令都能执行,可以使用 && 符号来连接它们,以确保前一个指令成功执行后才会执行下一个指令。

相关推荐
阿伟来咯~几秒前
记录学习react的一些内容
javascript·学习·react.js
吕彬-前端5 分钟前
使用vite+react+ts+Ant Design开发后台管理项目(五)
前端·javascript·react.js
学前端的小朱8 分钟前
Redux的简介及其在React中的应用
前端·javascript·react.js·redux·store
guai_guai_guai17 分钟前
uniapp
前端·javascript·vue.js·uni-app
也无晴也无风雨18 分钟前
在JS中, 0 == [0] 吗
开发语言·javascript
王哲晓1 小时前
第三十章 章节练习商品列表组件封装
前端·javascript·vue.js
理想不理想v2 小时前
‌Vue 3相比Vue 2的主要改进‌?
前端·javascript·vue.js·面试
酷酷的阿云2 小时前
不用ECharts!从0到1徒手撸一个Vue3柱状图
前端·javascript·vue.js
aPurpleBerry3 小时前
JS常用数组方法 reduce filter find forEach
javascript
ZL不懂前端3 小时前
Content Security Policy (CSP)
前端·javascript·面试