You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 23:00:02