sudo下的npm无法升级-sudo npm -v 与 npm -v版本号是不一样的

    技术2022-07-10  161

    快上线了发现环境有问题。。。

    发现问题出状况了怎么解决呢

    发现问题

    新增了一个上传文件的功能,用到strongloop,需要npm install strongloop依赖包,但是到线上测试安装时,发现总是报错:

    npm ERR! typeerror Error: Missing required argument #1 npm ERR! typeerror at andLogAndFinish (/usr/lib/node_modules/npm/lib/fetch-package-metadata.js:31:3) npm ERR! typeerror at fetchPackageMetadata (/usr/lib/node_modules/npm/lib/fetch-package-metadata.js:51:22) npm ERR! typeerror at resolveWithNewModule (/usr/lib/node_modules/npm/lib/install/deps.js:455:12) npm ERR! typeerror at /usr/lib/node_modules/npm/lib/install/deps.js:456:7 npm ERR! typeerror at /usr/lib/node_modules/npm/node_modules/iferr/index.js:13:50 npm ERR! typeerror at /usr/lib/node_modules/npm/lib/fetch-package-metadata.js:37:12 npm ERR! typeerror at addRequestedAndFinish (/usr/lib/node_modules/npm/lib/fetch-package-metadata.js:82:5) npm ERR! typeerror at returnAndAddMetadata (/usr/lib/node_modules/npm/lib/fetch-package-metadata.js:117:7) npm ERR! typeerror at pickVersionFromRegistryDocument (/usr/lib/node_modules/npm/lib/fetch-package-metadata.js:134:20) npm ERR! typeerror at /usr/lib/node_modules/npm/lib/fetch-package-metadata.js:109:7 npm ERR! typeerror This is an error with npm itself. Please report this error at: npm ERR! typeerror <http://github.com/npm/npm/issues> npm ERR! Linux 4.14.77-70.59.amzn1.x86_64 npm ERR! argv "/home/ec2-user/.nvm/versions/node/v10.4.0/bin/node" "/usr/bin/npm" "install" "strongloop" npm ERR! node v10.4.0 npm ERR! npm v3.8.6 npm ERR! code EMISSINGARG

    可以注意到npm的version是 v3.8.6,版本已经很老了!因为上线前,有一个相同环境配置的预部署服务器做对比,预服务器上安装都是ok的,就是npm的version是最新的。综合查的一些资源,都是建议升级npm版本。

    所以! 我们需要升级!!

    出状况了

    先看下npm版本号: sudo 下版本号为3.8.6 直接npm,版本号为6.4.0

    [root@ ec2-user]# sudo npm -v 3.8.6 [root@ ec2-user]# npm -v 6.4.1

    执行升级后,仍然,没有升级sudo npm,只是npm -v改变了

    [root@ ec2-user]# sudo npm install npm -g /home/ec2-user/.nvm/versions/node/v10.4.0/bin/npm -> /home/ec2-user/.nvm/versions/node/v10.4.0/lib/node_modules/npm/bin/npm-cli.js /home/ec2-user/.nvm/versions/node/v10.4.0/bin/npx -> /home/ec2-user/.nvm/versions/node/v10.4.0/lib/node_modules/npm/bin/npx-cli.js + npm@6.14.5 updated 1 package in 6.051s [root@ec2-user]# sudo npm -v 3.8.6 [root@ ec2-user]# npm -v 6.14.5

    这不难受么!不管我是执行 sudo npm install npm -g 还是npm install npm -g 结果都是一样的! sudo npm -v 下的版本号一直不变!!!

    怎么解决呢

    头脑风暴一下! npm装哪里的呢? which 命令!

    [root@ec2-user]# which npm /root/.nvm/versions/node/v10.4.0/bin/npm 看到这里只是一个软链,我们看看软链的地址 [root@ec2-user]# ll /root/.nvm/versions/node/v10.4.0/bin/npm lrwxrwxrwx 1 root root 38 Jun 30 03:44 /root/.nvm/versions/node/v10.4.0/bin/npm -> ../lib/node_modules/npm/bin/npm-cli.js [root@ec2-user]# sudo which npm /bin/npm [root@ec2-user]# ll /bin/npm lrwxrwxrwx 1 root root 38 Sep 23 2018 /bin/npm -> ../lib/node_modules/npm/bin/npm-cli.js

    到了这里,我们大胆猜想一下! npm工具实质上就是一个nodejs的脚本,我们用它来管理node模块,Fedora包管理器安装的npm和全局安装处理的方式差不多,在/bin/npm生成了lib/node_modules/bin/npm-cli.js的软链接,我们的npm就是它!! 好!那是不是我们把/bin/npm 软链到,高版本的npm的js文件上,就ok了呢?

    测试一下,软链一个新文件: /bin/kikitest [root@ec2-user]# ln -s /root/.nvm/versions/node/v10.4.0/lib/node_modules/npm/bin/npm-cli.js /bin/kikitest [root@ec2-user]# ll /bin/kikitest lrwxrwxrwx 1 root root 68 Jun 30 07:18 /bin/kikitest -> /root/.nvm/versions/node/v10.4.0/lib/node_modules/npm/bin/npm-cli.js 见证奇迹的时刻了!! 成功了!!! 我们可以这么玩,而且这样之后,安装都是ok的! [root@ ec2-user]# sudo /bin/kikitest -v 6.14.5

    ok!好似解决了!尝试一下,安装strongloop

    [root@ec2-user]# sudo /bin/kikitest install strongloop

    结果是成功的!!!‘’

    当下是这么解决的,重定向一下/bin/npm的软链!

    [root@ec2-user]# rm -rf /bin/npm [root@ec2-user]# ln -s /root/.nvm/versions/node/v10.4.0/lib/node_modules/npm/bin/npm-cli.js /bin/npm

    解决!

    Processed: 0.014, SQL: 9