在cPanel部署Node.js API时遭遇503及ERR_REQUIRE_ESM错误求助
解决Node.js + MySQL部署cPanel出现503及ERR_REQUIRE_ESM错误
错误根源
你的项目package.json中设置了"type": "module",将项目声明为ES模块(ESM),但cPanel搭载的LiteSpeed节点服务器(lsnode.js)是通过CommonJS规范的require()加载你的入口文件index.js,而require()不支持直接加载ESM模块,这就是触发ERR_REQUIRE_ESM错误、进而导致503服务不可用的核心原因。
解决方案
方案一:切换回CommonJS模块(推荐,无需服务器权限)
- 编辑项目根目录的
package.json,移除"type": "module"字段 - 将代码中的ESM语法替换为CommonJS语法:
- 把
import xxx from 'xxx'改为const xxx = require('xxx') - 把
export default xxx改为module.exports = xxx(或对应导出语法)
- 把
- 回到cPanel的Node.js管理界面,停止当前进程,执行
npm install,再重启进程
方案二:修改LiteSpeed的lsnode.js(需服务器文件权限)
如果你的服务器允许修改系统文件,可以调整lsnode.js的加载逻辑适配ESM:
- 找到文件
/usr/local/lsws/fcgi-bin/lsnode.js的第48行 - 替换原有的
require()加载代码为动态import():import(startupFile).then((module) => { var app = module.default || module; // 保留后续原本使用app的代码逻辑 }).catch((err) => { console.error('加载应用失败:', err); process.exit(1); }); - 重启LiteSpeed服务或Node.js进程
额外说明
- 服务器与本地Node.js版本(v18.9.1 vs v18.14.1)差异极小,不是引发问题的原因
- 之前安装
node-fetch@2.6.1的操作和当前错误无关,若切换回CommonJS后需使用fetch功能,可保留该依赖
内容的提问来源于stack exchange,提问作者Stykgwar
相关产品推荐
相关产品推荐

