NodeJS应用本地可正常运行 部署到EC2后启动报错如何解决?
可能原因及排查方案
核心原因优先级(匹配你提到的同实例其他分支正常、切分支仍报错的现象)
- esm加载器缓存未清理
你启动命令用了node -r esm加载esm模块,esm会默认在用户根目录生成.esm-cache缓存,也会在项目node_modules/.cache下生成缓存,切换分支时缓存不会自动更新,会导致加载旧版本的模块导出信息。
排查修复:执行以下命令清理后重试
rm -rf ~/.esm-cache rm -rf ./node_modules rm -rf ./package-lock.json npm i npm start
- 当前目录存在未被git跟踪的旧版本文件
如果general/general.js被加入了.gitignore,或者切换分支前该文件有未提交的修改,git切换分支时不会覆盖该文件,导致你看到的分支代码是对的,但实际运行时加载的是旧版本的文件。
排查修复:直接读取服务器上当前目录的目标文件内容,确认导出是否存在:
cat /home/ec2-user/reponame/general/general.js
如果内容确实不对,执行git checkout -- general/general.js强制覆盖本地修改即可。
- 文件名/路径大小写不匹配
EC2是Linux系统,文件系统大小写敏感,而本地Windows、macOS默认大小写不敏感。如果你的导入语句写的是import {randomFunction} from './General/General.js',但实际路径是./general/general.js,本地运行不会报错,但Linux下会加载失败或者加载到错误文件。
排查修复:核对导入语句的路径大小写,和实际服务器上的文件、文件夹名大小写完全一致。
其他可能原因
- Node版本/依赖版本不一致
如果正常运行的分支用了nvm指定Node版本,当前目录没有执行对应版本切换,会导致ES模块解析规则不同。另外如果两个分支的esm依赖版本不同,也会出现导出解析异常。
排查修复:分别在当前目录和正常分支目录执行node -v、npm list esm,对比版本是否一致,如果不一致统一版本即可。 - 文件权限异常
如果当前目录的general.js没有运行用户的读取权限,Node加载时会读取失败,也可能抛出导出不存在的异常。
排查修复:执行ls -l /home/ec2-user/reponame/general/general.js核对权限,和正常分支的对应文件权限保持一致即可。
内容的提问来源于stack exchange,提问作者Terry Windwalker
相关产品推荐
相关产品推荐

