如何不使用本地端口运行Express Node.js服务 解决终端关闭即停止问题
问题原因
你本地终端启动的Express服务是前台进程,终端会话结束时进程会被系统自动回收,所以服务会停止。你需要的无需本地端口运行的方案,本质是把后端服务和MySQL数据库部署到公共/私有服务器上,不依赖本地机器运行。
本地临时保活方案
如果只是本地测试不想每次关终端就停服务,可以用进程守护工具让服务在后台运行:
- 直接用Mac自带的
nohup命令启动:在项目目录执行nohup node 你的服务文件名.js &,服务就会在后台驻留,关闭终端也不会停止,运行日志默认输出到同目录的nohup.out文件中 - 也可以用Node专用进程管理工具pm2,先执行
npm install pm2 -g全局安装,之后用pm2 start 你的服务文件名.js启动服务,还可以通过pm2 logs查看日志、pm2 stop 服务名停止服务,管理更方便
无需本地运行的部署方案
要完全不依赖本地机器运行服务,可以选择两类部署方式:
- 云服务器部署:采购Linux云服务器,把Express代码上传到服务器,安装好Node环境、MySQL服务,用pm2运行后端服务,配置安全组开放对应端口后,前端直接请求云服务器公网IP+端口即可访问,不需要本地启动任何服务
- Serverless托管:把Express代码上传到支持Node运行的Serverless托管平台,平台会自动完成服务运行、扩容等运维操作,MySQL可以搭配使用云数据库服务,把云数据库的连接地址、账号密码填到你代码的MySQL连接配置里即可,全程不需要你维护服务器
现有代码优化建议
// 1. 建议把单次MySQL连接替换为连接池,避免高并发下连接失效 var mysql = require('mysql'); var pool = mysql.createPool({ host: "", user: "", password: "", database: "", connectionLimit: 10 // 可根据业务量调整连接数上限 }); // 2. 调整post接口逻辑,等数据库操作完成后再返回响应,避免前端拿到结果但实际插入失败 app.post('/', (req,res) => { var { ParticipantID } = req.body; var records = [[ParticipantID]]; if (records[0][0] != null) { pool.query("INSERT into Survey (ParticipantID) VALUES ?", [records], function(err, result, fields) { if(err) { return res.status(500).json('数据保存失败'); } res.json('Form received'); }); } else { res.status(400).json('参数缺失'); } });
- 数据库账号密码等敏感信息不要硬编码在代码中,建议通过环境变量读取,避免泄露
内容的提问来源于stack exchange,提问作者Brian Tang
相关产品推荐
相关产品推荐

