error:0308010c:digital envelope routines::unsupported
经过简单的查询,我马上找到了根本原因:
我本地安装的 nodejs 版本太高了,在使用 OpenSSL 相关功能的时候有兼容性问题。 为此,nodejs 专门提供了一个命令行参数--openssl-legacy-provider , 只要启用了这个参数就没问题了。
重点来了,只要你在网上搜索error:0308010c:digital envelope routines::unsupported
这个异常信息,
无论是 google 的还是百度的,给的解决方案都十分逆天,归类如下:
如果回答者提了一嘴 nvm 还能算个正经方案。
以我多年的经验,不知道 nvm 的草台前端开发多的是。
set NODE_OPTIONS=--openssl-legacy-provider && npm run dev
你要是觉得这个答案有简单又完美,我 TM 直接化身户晨风,安卓人安卓思维是吧,这是 window 的命令行才能用,你让苹果设备的同事怎么办??
ok,ok ,你继续搜索发现有质量更高的回答说,
Unix-like 系统在运行 npm run dev 之前执行 export NODE_OPTIONS=--openssl-legacy-provider
Windows 系统则先执行 set NODE_OPTIONS=--openssl-legacy-provider
哇哦,太棒了,简直完美,个屁。你让我每次运行项目之前都额外敲命令行吗??
这种不能配置化、代码化的解决方案,我要是明天来了十个新同事,
有用苹果的有用微软的,我是不是还得一个口头传授这个宝贵经验吗?
哎,其实写到这里我自己都心累了,有兴趣的 bro 你可以自己搜索试试。
我把我自己觉得最简单直接的解决方案写在这个帖子的最后面,欢迎交流。
我专门发这个帖子还有个目的,我在搜索的时候谷歌的 AI 也给了答案,
明显是参考了大量网络上的回答,都是我总结所述的方案,我实在是觉得,
AI 已经不知道烧掉了人类多少亿的资金了,这么小一个问题依然没有给出优质回答。
我认为正确处理问题的思路应该是,既然这是 nodejs 的配置问题,
那我在运行这个项目启动 nodejs 的时候给增加所需要的参数就好了。
那我是怎么启动 nodejs 的?通过 npm ,那么 npm 执行 script 的时候,
有没有办法给 node 传参?顺着这个思路,查询 npm 的文档,
最终我认为最简单、最直接、而且能够配置化的解决方案是:
在你项目的.npmrc 文件中增加一行配置:
node-options=--openssl-legacy-provider
(什么?你说你的前端项目从来没用过.npmrc 配置文件,那这是另外一个值得吐槽的草台故事了)
![]() |
1
pyyalt 1 天前
我之前也遇到的同样的问题,后来直接统一版本解决的。😁
|
![]() |
2
supuwoerc 1 天前
我是个人项目就不用 npmrc ,我喜欢借助 volta 来吧 node,pnpm,npm 啥的版本 pin 到项目,公司的项目因为有私服啥的才用 npmrc 来设置一些配置
|
4
iamwin 1 天前
会不会可能你看到这些文章发的时候,还没有这个参数?
|
![]() |
5
murmur 1 天前 ![]() 我也遇到个这个问题,结果是我现在电脑上从 6.0 到 22 装了一大堆 node 环境,不知道啥时候哪个版本就八字不合
|
![]() |
7
tcdw 1 天前 ![]() 我们当时用的是 cross-env 解决了两个平台之间指定环境变量方式不一样的问题。不过我认为,楼主的这个方案会更加优雅。
|
10
maggch97 1 天前 ![]() 关于 env 那一部分评论,我觉得你对 node ,对操作系统,对命令行等等都不是太懂的样子
|
12
deplives 23 小时 57 分钟前
|
13
deplives 23 小时 56 分钟前
兄弟,你不知道 npmrc ?
|
15
thealert 23 小时 56 分钟前 ![]() 很简单的问题搞得这么复杂也是绝了
|
![]() |
16
Vegetable 23 小时 55 分钟前 ![]() nodejs 升级带来的兼容性问题很多很常见,我也是第一次听说 volta 这个工具,之前都没听说过锁 nodejs 版本的工具。这一点踩过坑的人应该很多,确实挺恶心的。
|
17
deplives 23 小时 52 分钟前
@shadowyue #14 你给出的方案不就是 npmrc 增加 node-options=--openssl-legacy-provider
你都搜到了 export NODE_OPTIONS=--openssl-legacy-provider 觉得每次都要挂一个 export 不优雅都不知道这个是直接可以写到 npmrc 。那不就说明了你根本就不知道 npmrc 这个东西存在? |
![]() |
19
ultimate42 23 小时 48 分钟前
@maggch97 #10 我也觉得 稍微问了下 ai 给的几个方案都挺正常的,稍微做过几年前端都应该至少知道一个管理 node 版本的工具吧,项目固定 node 版本不是挺正常吗
|
20
mizuki9 23 小时 46 分钟前 ![]() node 使用最新版,在项目根目录下创建 .npmrc
|
21
deplives 23 小时 46 分钟前 ![]() @shadowyue #18 [捏麻麻的😡😡😡为什么很简单的前端问题网上搜到的答案质量居然这么差劲]
这是你的标题, 我质疑的是,这么个东西,不需要很复杂的搜索,我 Google 第一条,第一个 SOF 的回复就是这个方案,但是你一直在纠结 npm 要在命令行前面加一个 export 却完全不知道环境变量可以写在 npmrc 中。所以问题不在于搜索到的质量差 |
![]() |
23
ultimate42 23 小时 45 分钟前
@Vegetable nvm fnm volta 都能锁 node 版本吧,很多开源项目都有个.nvmrc 或者.node-version 的文件,不过我个人喜欢 volta
|
25
mizuki9 23 小时 43 分钟前 ![]() 没看见题主已经给出方案了,我瞎了
|
26
dode 23 小时 40 分钟前
AI 秒解决
|
![]() |
27
shadowyue OP @deplives #21
你这要求太高了,知道怎么配置 mac 或者 windows 环境变量的前端开发能有多少? 然后知道配置 npmrc 的前端开发又有多少? 你要知道普通开发只想要答案,你给解释思路是没用的,要把大家都当成草台班子。 |
![]() |
29
the1812 23 小时 38 分钟前 ![]() 这问题我也遇到过,搜到的都是绕过方法,最后自己研究了下是 webpack 一个插件内部调了 md4 hash ,这玩意高版本 Node 已经废弃删掉了
|
30
humbass 23 小时 37 分钟前 via Android ![]() nvm 不是基本操作吗
|
31
syseven 23 小时 37 分钟前 ![]() 多版本切换推荐 https://moonrepo.dev/proto
|
32
dode 23 小时 33 分钟前
|
33
TabGre 23 小时 32 分钟前 via iPhone ![]() ci/cd 碰到一次 原因是默认 nodejs 版本更新了 我 TM
|
36
mizuki9 23 小时 26 分钟前 ![]() 多版本 node 共存,然后切 node 是可以解决的。
但个人觉得优雅一点的方法是如题主所说,在 .npmrc 中加一行 node-options="--openssl-legacy-provider" 这样在小组中共同开发时,无论每个人用的时高版本还是低版本 node ,都可以直接 npm 运行,无需更多操作 |
37
FalconD 23 小时 25 分钟前 via Android ![]() @shadowyue
Gemini 2.5 Pro w/ built-in search Prompt: Persist it for node projects: NODE_OPTIONS=--openssl-legacy-provider npm run dev Response: 1.Modifying `package.json` Scripts 2.Using a `.npmrc` file 3.Setting Environment Variables at the OS Level Citations: https://stackoverflow.com/questions/77420041/how-to-set-node-options-for-all-package-json-scripts-at-once |
40
way2create 22 小时 42 分钟前
后端,不懂,遇到过几次,我都选择直接 nvm/pnpm 切 nodejs 版本
感觉这不能说明 AI 草台吧,这已经能解决问题了,而且又不是唯一解 "这是 window 的命令行才能用,你让苹果设备的同事怎么办" 这也没啥好吐槽的吧 知道意思是设置环境变量不就行了 |
41
Rache1 22 小时 26 分钟前
我没记错的话,当出现这个报错的时候, 报错信息里面就有引导添加 --openssl-legacy-provider 选项进行启动的说明
延申检索一下其实很容易找到相关的解决方案 --- 至于你说的不同环境下设置环境变量的方式不一样,其实 node 也有相关的包 cross-env 来解决。 --- 但是,如果当出现这个问题的时候,最好还是选择合适的 node 版本,因为你不知道还有没有其他更多的坑在等着你。 话说回来, 虽然 nvm 这类的 node 版本管理工具,但是很多前端开发,都没有管理 node 版本的这个概念,当拿到一个项目的时候,只有口口相传、或者靠猜,才能知道这个项目依赖的 node 版本是多少。 然而,nvm 有 .nvmrc ,社区还有 .node-verison ,package.json 里面甚至还有专门的 engines 字段用来保存记录这些信息等等各种方案,但是实际公司项目中却鲜有见到,都是靠口口相传。 |
![]() |
42
yigefanqie 18 小时 53 分钟前 via iPhone
你以为你这个答案就完美了啊,别人用低版本 node 就起不来了
|
![]() |
44
isa 18 小时 35 分钟前
技术问题避免搜索、查看中文内容, Google 搜索语言切换为英文, 你的问题在 Google 搜索第一个 stack overflow 的高赞回答就是最完善的答案
|
45
kekxv 18 小时 22 分钟前 via iPhone
package.json 里面直接加上,提交到仓库就好了:
"scripts": { "serve": "vue-cli-service serve --mode dev --host 0.0.0.0", "build": "vue-cli-service build --mode prod", "dev-height": "NODE_OPTIONS=--openssl-legacy-provider vue-cli-service serve --mode dev --host 0.0.0.0", "build-height": "NODE_OPTIONS=--openssl-legacy-provider vue-cli-service build --mode prod", "install-height": "npm install --legacy-peer-deps", "build:zip": "node build/build-zip.js" }, |
46
craftsmanship 18 小时 21 分钟前 via Android
@supuwoerc 能具体说说 nvm 有哪些问题吗
|
![]() |
47
Linho1219 18 小时 16 分钟前 via Android ![]() 写 .npmrc 不一定是好方案,因为会影响整个项目。大多数情况下都是某个命令碰到问题专门做设置。你对整个项目应用设置之后,要是影响到其他命令,排错会把你搞疯掉(因为你改动默认行为了)。此外如果这部分代码改动了没这个问题了,留在 .npmrc 里后续鬼知道这个选项为什么要放着。最佳实践应该还是 cross-env
|
![]() |
48
Linho1219 17 小时 41 分钟前 ![]() 以及同意上面说的楼主可能对 node ,跨平台这些不太熟悉。cross-env 算比较基本的工具了,问 AI 或者上网搜肯定一下子就出来了,怀疑楼主不仅不熟悉这些,prompt 水平也有限。
还有一点是我遇到兼容性问题的话第一反应是先找有没有替代的包,实在不行去尝试 patch 出问题的包。因为如果只是小问题的话 patch 一下是最方便的,而且如果后续包更新了,patch 也会在第一时间抛出错误要求人工介入,可维护性优良。npm 下使用 patch-package ,pnpm 下自带了。像命令行开关这种依赖 node 版本的,尤其是这种和 legacy 相关的指不定后面就移除了(不是指此例,而是指一般思路)。 针对这个问题我查了一下,实际上这个命令行开关对应 OpenSSL 的 OSSL_PROVIDER-legacy ,文档描述如下:The OpenSSL legacy provider supplies OpenSSL implementations of algorithms that have been deemed legacy. Such algorithms have commonly fallen out of use, have been deemed insecure by the cryptography community, or something similar. 那,本质是楼主的部分代码,或者依赖的代码使用了过时、不安全的密码学算法。如果是自己的代码,应该换用更安全的加密;如果不是自己的代码而是某个依赖,那这个依赖绝对会报 deprecated ,应当更换或者 patch 掉,这才是根本路径,用这个命令行开关不过是掩耳盗铃,把安全性问题埋起来了。如果你说安全性无所谓,如果不是密码学安全问题那用什么 OpenSSL 呢? 还有一个点,楼主疑似有点半桶水了,自己学得并不算特别怎么样却在那里说全世界都是烂的。所有回答都是社区共建共享的,每个回答都有局限性,有些是临时解法,有些是针对特定环境。如果你觉得 StackOverflow 或者其他论坛上的回答不好,你应该在下面回帖,而不是抱怨完拍拍屁股走了。如果楼主觉得这些和自己无关,那可能更适合去贴吧微博小红书发泄情绪,V2EX 都不太适合干这个 |
![]() |
50
wdssmq 9 小时 34 分钟前
在八月份,我遇到个 TortoiseGit 的使用问题,有篇发在 CSDN 但是内容是「未渲染的 Markdown 」姑且是正确答案,但是混杂在各种错误答案中间,错误答案也是 AI 生成又被各种采集。。
刚才用更精确的搜索描述重新搜索,Bing 的 AI 基于那篇正确答案重新总结了一遍又,但是强行把假定操作目标为「前前次提交」,加重了阅读负担; TortoiseGit 修改多条历史提交( commit message ) - 搜索 https://cn.bing.com/search?q=TortoiseGit+%E4%BF%AE%E6%94%B9%E5%A4%9A%E6%9D%A1%E5%8E%86%E5%8F%B2%E6%8F%90%E4%BA%A4%EF%BC%88commit+message%EF%BC%89 |
51
aloxaf 8 小时 37 分钟前
我觉得 set NODE_OPTIONS=--openssl-legacy-provider 这个答案已经很简单很完美了,我不知道逆天在哪里:首先能看出这是设置了一个环境变量,其次能看出这是给 node 增加了一个默认选项,这还不够吗?
觉得这个答案很逆天,才是真的逆天。 |
![]() |
52
ma46 8 小时 20 分钟前 ![]() 很难想象有程序员不会设置环境变量
|
![]() |
53
wangtian2020 8 小时 17 分钟前
又老又臭的项目会这样
|
54
NessajCN 8 小时 8 分钟前
我明白了,楼主不是来抱怨互联网上答案
而是来黑前端们有多菜的 当然也可能只是自爆而已 |
55
lnbiuc 8 小时 8 分钟前 ![]() 培训出来的的前端?怎么会不知道系统环境变量这东西
|
56
Isuxiz 7 小时 40 分钟前
环境变量属于不可配置的内容吗?是我癫了还是世界癫了?
|
![]() |
57
cherryas 7 小时 11 分钟前 ![]() 环境变量都成高深的技术了?
|
58
kakakakaka8889 7 小时 10 分钟前
你这个也没有解决本质问题啊,你只能解决你自己的整个项目的问题也没有解决,最佳方案就是切 node 版本用 nvm 或者其他管理工具多个项目多个版本就行了
|
60
deplives 6 小时 23 分钟前 ![]() @shadowyue #27 连环境变量没听过,这可不叫草台班子,这就是单纯的菜,菜的抠脚。别给前端招黑了,前端也算开发,我不信大多数不知道怎么配置环境变量。别把自己身边菜的抠脚的开发当做全世界都是这样。
|
![]() |
61
AItsuki 6 小时 3 分钟前
一样的,遇到复杂我问题都懒得问 AI ,不仅给你错误的答案,你纠正它还不行,它觉得它就是对的。等纠正到一定程度后又会失忆,真的是气的我脑淤血。AI 写点小工具,提供下思路还是可以的,其它的还是老老实实自己解决。
|
![]() |
62
bowencool 5 小时 58 分钟前
环境变量有一万种设置方法,只会个 export 我也是服了。
再说了,你这种问题的最佳解决方案是在项目中锁 nodejs 版本,fnm 自动切换了解一下(不喜欢用 nvm ) |
![]() |
64
canvascat 3 小时 29 分钟前
老项目切 node 版本不是很正常吗,我这儿甚至有个项目只有 node<=10 才能运行😅
|
65
abc1310054026 3 小时 2 分钟前
我反对,不符合 OP 期望的答案就不是优质答案。
网友回答的解决方法总归是出于好心,更何况解决方案确实有效,只是不符合 OP 想象中的优质回答。 再者,“草台班子” 这个就是大伙调侃。写代码的更加清楚一个系统必然会有大大小小的缺陷,你不能逮着个一个 bug 说整个系统就是 “草台班子”。 |
![]() |
66
zhangsansama 2 小时 58 分钟前
|
67
xiaxiaocao 2 小时 51 分钟前
明白了,OP 用的是 mac & OP 不会设置环境变量
|
68
Need4more 2 小时 48 分钟前
这就是前端吗?
既然你通过搜索知道了添加环境变量,但是你不想敲命令启动项目,想配置化, ok ,没问题。 但是谁告诉你环境变量只有这一种方式添加? 如果你有一点 shell 知识,就知道这样就能满足你的需求 "scripts": { "serve": "NODE_OPTIONS=--openssl-legacy-provider npm run dev", } 不懂 shell 也没关系,我只是个前端仔,现在不是有 ai 吗? 那看看 ai 怎么回答,这是我刚刚用最垃圾的百度给出的答案: https://mr.baidu.com/r/1JB8DJGd4LS?f=ot&u=d422cfec2bb43b20 这不是解决了吗? ----------- 看的出来 op 作为一个前端,有基本的信息检索能力,但是基础知识不够牢固,ai 工具使用不够熟练,还谜之自大, 草台的是你,不是我们,不是 AI |
![]() |
69
MRG0 2 小时 41 分钟前
版本问题 nvm 搞一下算了
|
![]() |
70
shadowyue OP @Need4more #68
我勒个豆啊,捏麻麻我都不想回这个帖子了。大哥,你看完我帖子了吗? 你这 script 在 window 设备上试试生不生效? 我内容写的清清楚楚,我当然知道这种很简单,你只管用苹果的同事吗 |
71
maxxxxx 1 小时 58 分钟前
给你的都是最直接最简单的解决方案,没什么问题。谁知道提问者有没有版本管理器,想不想设环境变量。
|
72
Need4more 1 小时 55 分钟前
“以我多年的经验,不知道 nvm 的草台前端开发多的是。”
“AI 已经不知道烧掉了人类多少亿的资金了,这么小一个问题依然没有给出优质回答” “什么?你说你的前端项目从来没用过.npmrc 配置文件,那这是另外一个值得吐槽的草台故事了” 合着就是没有前端比我懂 nvm ,没有人比我懂 ai ,没有前端比我懂 npm 呗。请问这些字里行间的优越感,来自哪里? 既然你已经知道了环境变量的平台问题,随便问哪个 ai 都能给出跨平台的解决方案,欸,就是不问,还要写篇文章把 ai 批判一番,把前端同行贬低一番。 捏麻麻的 |
![]() |
73
liubaicai 1 小时 50 分钟前
没觉得,我搜了下,感觉前面几个加上谷歌 ai 给的,都能解决这个问题,谈不上差劲。
|