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 的参数传递给它。

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

相关推荐
下雪天的夏风6 分钟前
TS - tsconfig.json 和 tsconfig.node.json 的关系,如何在TS 中使用 JS 不报错
前端·javascript·typescript
diygwcom18 分钟前
electron-updater实现electron全量版本更新
前端·javascript·electron
volodyan21 分钟前
electron react离线使用monaco-editor
javascript·react.js·electron
^^为欢几何^^30 分钟前
lodash中_.difference如何过滤数组
javascript·数据结构·算法
Hello-Mr.Wang35 分钟前
vue3中开发引导页的方法
开发语言·前端·javascript
程序员凡尘1 小时前
完美解决 Array 方法 (map/filter/reduce) 不按预期工作 的正确解决方法,亲测有效!!!
前端·javascript·vue.js
北岛寒沫5 小时前
JavaScript(JS)学习笔记 1(简单介绍 注释和输入输出语句 变量 数据类型 运算符 流程控制 数组)
javascript·笔记·学习
everyStudy5 小时前
JavaScript如何判断输入的是空格
开发语言·javascript·ecmascript
无心使然云中漫步7 小时前
GIS OGC之WMTS地图服务,通过Capabilities XML描述文档,获取matrixIds,origin,计算resolutions
前端·javascript
Bug缔造者7 小时前
Element-ui el-table 全局表格排序
前端·javascript·vue.js