使用nvm管理Node.js时执行sudo lt命令报yargs版本兼容错误
问题解决:sudo执行localtunnel时Node版本不匹配报错
问题详情
- 系统环境:Ubuntu 20.04.6,nvm 0.39.1管理Node.js 18.15.0
- 执行命令:
sudo lt --port 25565 - 报错信息:
yargs supports a minimum Node.js version of 12 - 排查情况:
nvm ls显示当前用户使用Node.js 18.15.0,但重装Node.js、nvm及执行sudo apt update后问题仍存在
错误堆栈
/usr/local/lib/node_modules/localtunnel/node_modules/yargs/build/index.cjs:1 "use strict";var t=require("assert");class e extends Error{constructor(t){super(t||"yargs error"),this.name="YError",Error.captureStackTrace(this,e)}}let s,n=[];function i(t,o,a,h){s=h;let l={};if(Object.prototype.hasOwnProperty.call(t,"extends")){if("string"!=typeof t.extends)return l;const r=/\.json|\..*rc$/.test(t.extends);let h=null;if(r)h=function(t,e){return s.path.resolve(t,e)}(o,t.extends);else try{h=require.resolve(t.extends)}catch(e){return t}!function(t){if(n.indexOf(t)>-1)throw new e(`Circular extended configurations: '${t}'.`)}(h),n.push(h),l=r?JSON.parse(s.readFileSync(h,"utf8")):require(t.extends),delete t.extends,l=i(l,s.path.dirname(h),a,s)}return n=[],a?r(l,t):Object.assign({},l,t)}function r(t,e){const s={};function n(t){return t&&"object"==typeof t&&!Array.isArray(t)}Object.assign(s,t);for(const i of Object.keys(e))n(e[i])&&n(s[i])?s[i]=r(t[i],e[i]):s[i]=e[i];return s}function o(t){const e=t.replace(/\s{2,}/g," Error: yargs supports a minimum Node.js version of 12. Read our version support policy: https://github.com/yargs/yargs#supported-nodejs-versions at Object.<anonymous> (/usr/local/lib/node_modules/localtunnel/node_modules/yargs/build/index.cjs:1:57316) at Module._compile (internal/modules/cjs/loader.js:778:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10) at Module.load (internal/modules/cjs/loader.js:653:32) at tryModuleLoad (internal/modules/cjs/loader.js:593:12) at Function.Module._load (internal/modules/cjs/loader.js:585:3) at Module.require (internal/modules/cjs/loader.js:692:17) at require (internal/modules/cjs/helpers.js:25:18) at Object.<anonymous> (/usr/local/lib/node_modules/localtunnel/node_modules/yargs/index.cjs:5:30) at Module._compile (internal/modules/cjs/loader.js:778:30)
nvm ls输出
v12.22.12 v16.20.0 -> v18.15.0 system default -> 16.20 (-> v16.20.0) iojs -> N/A (default) unstable -> N/A (default) node -> stable (-> v18.15.0) (default) stable -> 18.15 (-> v18.15.0) (default) lts/* -> lts/hydrogen (-> v18.15.0) lts/argon -> v4.9.1 (-> N/A) lts/boron -> v6.17.1 (-> N/A) lts/carbon -> v8.17.0 (-> N/A) lts/dubnium -> v10.24.1 (-> N/A) lts/erbium -> v12.22.12 lts/fermium -> v14.21.3 (-> N/A) lts/gallium -> v16.20.0 lts/hydrogen -> v18.15.0
原因分析
sudo执行命令时会切换到root用户环境,而root用户未配置nvm,默认使用系统预装的Node.js版本(该版本大概率低于12),导致localtunnel依赖的yargs触发版本校验报错。当前用户的nvm配置仅对普通用户生效,root环境无法读取。
解决方案
方案1:无需sudo直接执行
25565不属于Linux特权端口(1-1024),普通用户有权限绑定该端口,直接执行:
lt --port 25565
方案2:让sudo继承当前用户环境
使用-E参数保留当前用户的环境变量(包括nvm配置),执行:
sudo -E lt --port 25565
方案3:指定Node.js路径执行
- 先查看当前用户的Node.js路径:
which node
- 再查看lt的路径:
which lt
- 用sudo直接调用指定版本的Node执行lt(替换为实际路径):
sudo ~/.nvm/versions/node/v18.15.0/bin/node ~/.nvm/versions/node/v18.15.0/bin/lt --port 25565
方案4:给root用户配置nvm
- 切换到root用户:
sudo su
- 安装nvm:从官方渠道获取v0.39.1版本的安装脚本执行(与普通用户安装流程一致)
- 重新加载环境变量:
source ~/.bashrc
- 安装Node.js 18.15.0并设置为默认:
nvm install 18.15.0 nvm alias default 18.15.0
- 安装localtunnel:
npm install -g localtunnel
之后即可直接用sudo执行lt命令。
内容的提问来源于stack exchange,提问作者Sterling Deye
相关产品推荐
相关产品推荐

