我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

平心而论,nodejs程序的一个大弊病就是:第三方依赖太多,老程序过一年就跑不起来了,各种依赖版本报错。所以,才会需要对第三方版本库进行lock处理。但是,并没有锁定node版本的说法。这可能就是本文所描述的问题的背景信息。

苏南大叔:新node运行老项目,digital envelope routines::unsupported - digital envelope routines unsupported
新node运行老项目,digital envelope routines::unsupported(图2-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码经验文章。本文测试环境:win10nodejs@20.18.0。测试代码的库版本:webpack@5.26.3react@17.0.2react-router-dom@6.16.0

错误代码

执行定义在package.json里面的脚本:

webpack --config webpack.config.server.js

得到错误信息:

\node_modules\loader-runner\lib\LoaderRunner.js:146
                if(isError) throw e;
                            ^
Error: error:0308010C:digital envelope routines::unsupported
    at new Hash (node:internal/crypto/hash:79:19)
    at Object.createHash (node:crypto:139:10)
    at BulkUpdateDecorator.hashFactory (\node_modules\webpack\lib\util\createHash.js:144:18)
    at BulkUpdateDecorator.update (\node_modules\webpack\lib\util\createHash.js:46:50)
    at RawSource.updateHash (\node_modules\webpack-sources\lib\RawSource.js:64:8)
    at NormalModule._initBuildHash (\node_modules\webpack\lib\NormalModule.js:804:17)
    at handleParseResult (\node_modules\webpack\lib\NormalModule.js:869:10)
    at \node_modules\webpack\lib\NormalModule.js:960:4
    at processResult (\node_modules\webpack\lib\NormalModule.js:691:11)
    at \node_modules\webpack\lib\NormalModule.js:743:5 {
  opensslErrorStack: [
    'error:03000086:digital envelope routines::initialization error',
    'error:0308010C:digital envelope routines::unsupported'
  ],
  library: 'digital envelope routines',
  reason: 'unsupported',
  code: 'ERR_OSSL_EVP_UNSUPPORTED'
}

Node.js v20.18.0

这个错误提示信息,一看就懵。

苏南大叔:新node运行老项目,digital envelope routines::unsupported - 错误截图
新node运行老项目,digital envelope routines::unsupported(图2-2)

解决方案一

解决方案呢,就是给node程序加个环境变量。名为:NODE_OPTIONS,值为--openssl-legacy-provider

根据下面这两篇文章的内容,提出合理的解决方案,进行解决。

对于win10环境下来说,有如下选择:

原命令:

webpack --config webpack.config.server.js

新命令(win):

set NODE_OPTIONS=--openssl-legacy-provider&& webpack --config webpack.config.server.js

或者

cross-env NODE_OPTIONS=--openssl-legacy-provider webpack --config webpack.config.server.js
注意:--openssl-legacy-provider最开始的是两个英文中划线。另外,使用&&符合的时候,前面没有空格没有空格!

意思就是:
在原命令前面,增加一个全局的变量:NODE_OPTIONS=--openssl-legacy-provider,用set增加还是用cross-env增加,就看你方便了。

解决方案二

如果没有特定理由,非要使用当前高版本node的话,降级到合适的node版本号,也是个明智的选择。

结束语

本文的命令代码,仅仅是做个兼容,并非最佳解决方案。其实调试nodejs的老项目代码,是一件非常痛苦的事情。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   node