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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 21:45:40