小墨の博客

梦想需要付诸行动,否则只能是梦

执行npm命令报错 TypeError: Class extends value undefined is not a constructor or null

今天登录服务器,想部署一个node项目,于是习惯性的git clone项目代码,然后使用 npm i 安装依赖,这个时候问题出现了。

探究过程

【备注】如果不想看过程,只想看结果,请直接拉到最后。


npm直接报了个错,错误信息如下:

ubuntu@VM-4-14-ubuntu:~$ npm -v
/usr/lib/node_modules/npm/lib/cli.js:35
    throw err
    ^

TypeError: Class extends value undefined is not a constructor or null
    at Object.<anonymous> (/usr/lib/node_modules/npm/node_modules/path-scurry/dist/cjs/index.js:134:40)
    at Module._compile (node:internal/modules/cjs/loader:1275:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1329:10)
    at Module.load (node:internal/modules/cjs/loader:1133:32)
    at Module._load (node:internal/modules/cjs/loader:972:12)
    at Module.require (node:internal/modules/cjs/loader:1157:19)
    at require (node:internal/modules/helpers:119:18)
    at Object.<anonymous> (/usr/lib/node_modules/npm/node_modules/glob/dist/cjs/glob.js:5:23)
    at Module._compile (node:internal/modules/cjs/loader:1275:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1329:10)

Node.js v19.9.0

当时因为这个服务器上正在运行着其他项目,所以不太敢直接操作,折中把本地的 node_modules 文件夹直接拷到服务器上勉强先把项目跑起来了。但是这样其实不太好,毕竟如果使用了其他包管理器,有些软链接、硬链接就容易出问题。


于是乎,终于抽出时间了,来研究解决一下这个问题。毕竟是自己的服务器,也没办法赖其他人,如果是公司的服务器说不定哪个同事就被我拉来背锅了(偷笑)。

仔细想了想,发现这个问题的时候其实有段时间没动服务器了,可能是因为当时手贱执行了一下apt upgrade把所有能更新的东西都更到最新了。


在网上搜了一圈,发现遇到这个报错的也不都是npm的问题,和我遇到相同问题的人基本上都是重装解决的,那我也重装一下试试。

比如:https://stackoverflow.com/questions/70891176/every-time-i-run-npm-i-get-this-message-class-extends-value-undefined-is-not-a


首先明确了我的node是使用 sudo apt-get install nodejs 安装的,那首先就是尝试如下命令:

# 这个命令没用,不要无脑直接复制执行
sudo apt-get remove nodejs
sudo apt-get install nodejs

一通操作下来,还是不行。


那可能是我本地的node_modules的依赖中文件出问题了,那删一下试试:

cd /usr/lib/node_modules/npm
# 执行前确保你知道自己在做什么,因执行这条命令造成的数据丢失请自行承担责任
sudo rm -rf node_modules

好了,现在npm没了

ubuntu@VM-4-14-ubuntu:~$ npm -v
/usr/lib/node_modules/npm/lib/cli.js:35
    throw err
    ^

Error: Cannot find module 'semver/functions/satisfies'
Require stack:
- /usr/lib/node_modules/npm/lib/cli.js
- /usr/lib/node_modules/npm/bin/npm-cli.js
    at Module._resolveFilename (node:internal/modules/cjs/loader:1090:15)
    at Module._load (node:internal/modules/cjs/loader:934:27)
    at Module.require (node:internal/modules/cjs/loader:1157:19)
    at require (node:internal/modules/helpers:119:18)
    at module.exports (/usr/lib/node_modules/npm/lib/cli.js:41:21)
    at Object.<anonymous> (/usr/lib/node_modules/npm/bin/npm-cli.js:2:25)
    at Module._compile (node:internal/modules/cjs/loader:1275:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1329:10)
    at Module.load (node:internal/modules/cjs/loader:1133:32)
    at Module._load (node:internal/modules/cjs/loader:972:12) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/usr/lib/node_modules/npm/lib/cli.js',
    '/usr/lib/node_modules/npm/bin/npm-cli.js'
  ]
}


既然都没了,那再重装一下得了:

sudo apt-get reinstall nodejs


终于,功夫不负有心人,成了!

ubuntu@VM-4-14-ubuntu:~$ npm -v
9.6.3



解决方案

所以,整理一下上面的内容,大概就是:

如果你是和我类似使用的Linux系统(我用的Ubuntu 20.04 ),同时使用了以下命令+apt install安装的node

curl -fsSL https://deb.nodesource.com/setup_19.x | sudo -E bash - &&\

那么你可以在做好充足备份的前提之下,通过以下命令删除 node_modules 文件夹

cd /usr/lib/node_modules/npm
# 执行前确保你知道自己在做什么,因执行这条命令造成的数据丢失请自行承担责任
sudo rm -rf node_modules

然后使用以下命令重新安装node

sudo apt-get reinstall nodejs

不出所料应该就可以了

ubuntu@VM-4-14-ubuntu:~$ npm -v
9.6.3

最后,记得更新一下npm

sudo npm i -g npm

更新后的版本(在我写这篇博客到你看到这篇博客期间npm估计会有更新,所以你的版本可能比我更新)

ubuntu@VM-4-14-ubuntu:~$ npm -v
9.8.1


张小弟之家

本文链接:
文章标题:

本站文章除注明转载/出处外,均为原创,若要转载请务必注明出处。转载后请将转载链接通过邮件告知我站,谢谢合作。本站邮箱:admin@only4.work

尊重他人劳动成果,共创和谐网络环境。点击版权声明查看本站相关条款。

    发表评论:

    搜索
    本文二维码
    标签列表
    站点信息
    • 文章总数:547
    • 页面总数:20
    • 分类总数:96
    • 标签总数:213
    • 评论总数:63
    • 浏览总数:287025

    | | |
    | |  Z-Blog PHP