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

Node.js模块化开发中MySQL连接在路由内报错问题求助

问题分析与解决方案

核心问题

你遇到的connection is not defined报错,结合代码来看,大概率是以下两种情况之一:

  • 路由回调内存在变量遮蔽(不小心重新声明了connection变量)
  • 代码拼写错误(比如把connection写成了其他拼写)

另外,你的路由代码里还有一个明显问题:SQL_query未定义,这也会导致报错,需要一并修正。

为什么顶部的connection.query能运行?

你的mysql.js导出的是连接池对象(pool),而admin.js里的var connection = require('./mysql')拿到的就是这个连接池。mysql模块的连接池支持直接调用.query()方法(内部会自动从池里获取连接、用完释放),所以顶部的查询能正常执行。

修复步骤

1. 修正路由内的变量问题

确保路由回调里没有重新声明connection变量,同时定义好SQL_query:

// admin.js 路由部分修正
router.get('/menu/users/getAccessFor/:user_id', (request, response) => {
   // 1. 获取URL参数并定义SQL语句(替换成你的实际业务SQL)
   const user_id = request.params.user_id;
   const SQL_query = "SELECT * FROM your_access_table WHERE user_id = ?";

   // 2. 确保这里的connection是模块顶部导入的连接池
   console.log(connection); // 这里应该输出pool对象,而非undefined

   // 3. 执行查询,用参数化查询防止SQL注入
   connection.query(SQL_query, [user_id], (err, rows, fields) => {
      if (err) {
          console.error('数据库查询错误:', err);
          return response.status(500).send('服务器内部错误');
      }
      // 返回查询结果
      response.json(rows);
   })
})

2. 优化mysql.js的连接池代码

你的mysql.js里的pool.getConnection只是做了简单连接测试,改成连接池状态监控更利于排查问题:

// mysql.js 优化后代码
let mysql = require('mysql');
let fs    = require('fs');

var sql_security_logs = JSON.parse(fs.readFileSync('secret.json', 'utf8'))["sql_security_logs"];

var pool = mysql.createPool({
    connectionLimit: 10,
    host           : sql_security_logs["host"],
    user           : sql_security_logs["user"],
    password       : sql_security_logs["password"],
    database       : sql_security_logs["database"],
    port           : sql_security_logs["port"]
})

// 监控连接池状态,方便排查连接问题
pool.on('connection', (conn) => {
  console.log(`数据库连接建立,线程ID: ${conn.threadId}`);
});

pool.on('acquire', (conn) => {
  console.log(`获取连接,线程ID: ${conn.threadId}`);
});

pool.on('release', (conn) => {
  console.log(`释放连接,线程ID: ${conn.threadId}`);
});

module.exports = pool;

3. 排查变量遮蔽问题

检查你的实际代码中,路由回调里是否有类似var connection = ...或let connection = ...的代码,这会遮蔽模块顶部的connection变量,直接导致报错connection is not defined。

额外注意事项

  • 始终使用参数化查询(比如代码中的[user_id]),避免SQL注入风险
  • 确保secret.json文件路径正确,且数据库配置项无误
  • 若使用mysql2模块,API与mysql基本兼容,但需注意部分细节差异

内容的提问来源于stack exchange,提问作者Marius Magaud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:30:33