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
相关产品推荐
相关产品推荐

