使用Express时pm2出现Unexpected identifier错误求助
问题排查与解决方案
梳理几个核心问题,逐个解决:
1. HTTPS模块导入错误
你的index.js里存在明显的模块导入错误:
import https from 'http';
应该导入https模块而非http,修正后:
import https from 'https';
这个错误会直接导致调用https.createServer时失效,因为http模块不存在该方法。
2. 特权端口权限限制
服务器上80、443属于特权端口,普通用户运行Node进程默认没有绑定这类端口的权限(Linux系统安全限制),这是服务崩溃的常见原因。
解决方法(三选一,推荐第三种):
- 方法一:使用root用户运行pm2(不推荐,存在安全风险)
- 方法二:给Node进程授权绑定特权端口,执行命令:
sudo setcap 'cap_net_bind_service=+ep' $(which node) - 方法三:改用非特权端口(如3000、4430),再通过Nginx反向代理到80/443(安全且便于后续扩展管理)
3. SSL证书路径问题
你使用./ssl/privkey.key这类相对路径读取证书,服务器上pm2的工作目录可能和本地不一致,导致文件找不到。
解决方法:
- 结合
__dirname使用绝对路径读取证书,确保路径准确:key: fs.readFileSync(path.resolve(__dirname, './ssl/privkey.key')), cert: fs.readFileSync(path.resolve(__dirname, './ssl/cert.cer')), - 提前确认服务器上
ssl文件夹的位置,保证文件存在且Node进程有读取权限。
4. 启动脚本与目录结构问题
你的package.json中start脚本是react-scripts start,这是启动React开发服务器的命令,而非启动Express后端的命令。如果pm2直接用npm start启动,会跑React开发服务而非你的后端。
解决方法:
- 在
package.json中新增后端启动脚本:"scripts": { "start": "react-scripts start", "start:server": "node index.js", // 新增后端启动命令 "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject" } - pm2启动时执行:
pm2 start npm --name "your-app-name" -- run start:server
另外,静态文件路径与SPA fallback路径不一致:
app.use(express.static(path.resolve(__dirname, 'build'))); // 指向根目录下的build app.get('*', (req, res) => { res.sendFile(path.resolve(__dirname, '../client/build', 'index.html')); // 指向../client/build });
React的npm run build默认将产物生成在项目根目录的build文件夹,而非client/build,需统一路径:
app.get('*', (req, res) => { res.sendFile(path.resolve(__dirname, 'build', 'index.html')); });
5. 冗余依赖清理
package.json中的fs、http、https、path、url都是Node.js内置模块,无需单独安装,直接导入即可使用。将它们从dependencies中删除,避免不必要的依赖冲突。
内容的提问来源于stack exchange,提问作者Ruffyg
相关产品推荐
相关产品推荐

