Node.js连接本地MySQL时提示mysql未定义的问题排查
问题分析与修复方案
一、"mysql is not defined" 错误的原因及解决
1. 未安装mysql模块
你只通过require引入了模块,但可能没在项目中安装依赖。执行以下命令完成安装:
npm install mysql
注意:mysql模块已长期未维护,若你的Node.js版本在v14及以上,更推荐使用mysql2模块,安装命令为npm install mysql2,引入时改为const mysql = require('mysql2')
2. 作用域被意外覆盖
检查代码中是否有其他逻辑修改了mysql变量,比如在某个局部作用域重新定义了同名变量。可以在Model的构造函数中添加console.log(mysql),如果输出undefined,说明变量被覆盖,排查并修改相关代码即可。
二、代码中的其他致命问题
即使mysql定义正常,你的execute方法也会报错,核心问题是回调函数中的this指向混乱:
在this.connection.connect(function(err) { ... })的回调里,this不再指向Model实例,而是指向connect方法的上下文,导致this.connection会出现"Cannot read property 'connection' of undefined"的错误。
修复方法
方案1:使用箭头函数(继承外层this)
execute(sqlquery) { this.connection.connect((err) => { if (err) { return err; } else { this.connection.query(sqlquery, (err, result) => { if (err) { console.error(err); return false; } // 此处需处理查询结果,比如返回或回调 console.log(result); }); this.connection.end((err) => { if (err) { console.error(err); return err; } }); return true; } }); }
方案2:提前保存this引用
execute(sqlquery) { const self = this; // 保存当前实例的this this.connection.connect(function(err) { if (err) { return err; } else { self.connection.query(sqlquery, function(err, result) { if (err) { console.error(err); return false; } console.log(result); }); self.connection.end(function(err) { if (err) { console.error(err); return err; } }); return true; } }); }
三、额外优化建议
1. 使用连接池替代单次连接
频繁创建/关闭连接会降低性能,推荐使用连接池自动管理连接:
const mysql = require('mysql2'); // 创建连接池 const pool = mysql.createPool({ host: 'localhost', port: '3306', user: 'creativepages', password: 'creativepages', database: 'main', connectionLimit: 10, // 最大连接数 queueLimit: 0 }); class Model { execute(sqlquery) { return new Promise((resolve, reject) => { pool.query(sqlquery, (err, result) => { err ? reject(err) : resolve(result); }); }); } }
2. 用Promise/async-await优化回调嵌套
使用mysql2的Promise版本,避免回调地狱:
const mysql = require('mysql2/promise'); const pool = mysql.createPool({ host: 'localhost', port: '3306', user: 'creativepages', password: 'creativepages', database: 'main' }); class Model { async execute(sqlquery) { try { const [rows] = await pool.query(sqlquery); return rows; } catch (err) { console.error(err); throw err; } } }
内容的提问来源于stack exchange,提问作者Roger Schneiter
相关产品推荐
相关产品推荐

