升级Ubuntu20.04后Node.js应用启动模块不兼容如何无损重编译?
问题根因
你遇到的报错是因为weak包属于Node.js原生扩展模块,此前在Ubuntu 18.04环境下基于旧版Node.js编译生成的二进制文件,和当前Ubuntu 20.04自带的Node.js v10.19.0版本的二进制接口不兼容:旧模块对应NODE_MODULE_VERSION 57,当前Node.js版本要求NODE_MODULE_VERSION 64,因此无法加载。
以下操作全程不会触及你的业务代码、配置、存储数据,可确保数据安全:
前置准备(规避数据风险)
- 先停止运行中的Node.js应用进程,避免文件读写冲突
- 执行命令备份整个应用目录,万无一失:
cp -r /home/blruser/mibs /home/blruser/mibs_backup_$(date +%Y%m%d) - 确认你的业务数据、配置文件、存储目录均不在
node_modules目录下(常规项目结构都不会将业务数据存放在该目录,这一步仅作风险确认)
修复方案
方案一:原地重建原生模块(优先推荐,不改变现有依赖版本)
进入应用根目录,仅针对不兼容的weak模块单独重编译:
cd /home/blruser/mibs npm rebuild weak
如果修复后启动还有其他同类原生模块不兼容报错,直接重编译所有已安装的原生模块即可:
npm rebuild
方案二:全量重装依赖(适配性更强,无旧编译文件残留)
如果方案一执行后仍有报错,可以删除整个node_modules目录后重新安装所有依赖,该操作也不会影响业务数据:
cd /home/blruser/mibs rm -rf node_modules npm install
验证
操作完成后正常启动Node.js应用,检查业务功能是否正常、运行日志无报错即修复完成。
注意:如果此前安装依赖时使用了
sudo权限,执行重建/安装命令时也需要加上sudo保持权限一致,避免出现读写权限报错。
内容的提问来源于stack exchange,提问作者user4948798
相关产品推荐
相关产品推荐

