使用pm2部署Node.js时MySQL插入行报ECONNREFUSED错误怎么解决
问题排查&修复方案
1. 先解决ECONNREFUSED报错
这个报错是MySQL服务连接被拒绝,和使用连接池本身没有直接关联,按优先级排查以下问题:
- 确认本地MySQL服务处于正常运行状态:
macOS可执行brew services list查看mysql服务状态,Windows在服务管理器中检查MySQL服务启动状态,Linux执行systemctl status mysqld/systemctl status mariadb检查。 - 确认pm2运行时正确加载了环境变量:
你代码中MySQL配置全部读取process.env环境变量,pm2默认不会自动继承当前终端的环境变量,也不会主动加载项目下的.env文件,这是此类场景最常见的问题。
可以先在创建连接池的代码前加一行日志,查看pm2运行日志确认环境变量取值是否符合预期:
修复方式二选一:console.log('MYSQL配置校验:', process.env.MYSQL_HOST, process.env.MYSQL_USER, process.env.MYSQL_PASS)- 在代码最顶部引入
dotenv包加载.env文件 - 将环境变量配置写入pm2的生态配置文件
ecosystem.config.js中,启动时加载配置
- 在代码最顶部引入
- 确认MySQL端口未被修改、本地防火墙未拦截3306端口的连接请求。
2. 修复INSERT语句&代码错误
你当前的代码存在两个明显问题:
- 缺少express实例初始化:定义
express后没有初始化实例就直接用app变量,需要补充一行const app = express() - INSERT语法不符合
mysql包的占位符规则:
单条插入时VALUES后需要加括号,参数直接传对应值即可,正确写法如下:
如果后续需要批量插入多条数据,再使用const express = require('express'); const app = express(); // 补充初始化代码 var mysql = require('mysql'); // 建议优先引入dotenv加载环境变量,确保pm2运行时配置正常 // require('dotenv').config() const pool = mysql.createPool({ connectionLimit: process.env.MYSQL_CONLIM || 10, // 可以加默认值避免环境变量缺失报错 host: process.env.MYSQL_HOST || '127.0.0.1', user: process.env.MYSQL_USER || 'root', password: process.env.MYSQL_PASS || '', database: process.env.MYSQL_DBNAME || 'test' }); app.post('/', (req, res, next) => { var context = {}; // 修正占位符写法:VALUES 后加() pool.query("INSERT INTO Survey (ParticipantID) VALUES (?)", [req.query.c], function(err, result) { if (err) { next(err); return; } context.results = "Inserted id " + result.insertId; res.render('home', context); }); }); app.listen(3001,()=>console.log("Port 3001"));VALUES ?的写法,参数传二维数组即可:// 示例:批量插入3条ParticipantID记录 const insertValues = [[101], [102], [103]] pool.query("INSERT INTO Survey (ParticipantID) VALUES ?", [insertValues], (err, result) => { // 处理逻辑 })
3. 学习建议
直接参考mysql包的官方npm文档即可,里面覆盖了连接池配置、所有CRUD操作的规范示例,足够满足日常开发需求。
内容的提问来源于stack exchange,提问作者Brian Tang
相关产品推荐
相关产品推荐

