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

Node.js中MySQL连接成功但无法执行查询的问题排查

TypeError: conexao.query is not a function - MySQL Connection Class Issue

我来帮你分析这个问题,其实原因很简单——你搞混了对象层级!

你创建的Conexao类实例本身并没有query方法,query是属于Conexao内部的connection属性(也就是mysql.createConnection()返回的原生MySQL连接对象)的方法。你在getCargos里直接调用conexao.query,自然会找不到这个方法,而控制台打印conexao能看到connection属性,也印证了这一点。

解决方案1:在Conexao类中封装query方法

推荐这种方式,更符合面向对象的封装原则,外部调用也更简洁:
修改你的Conexao类,新增一个query方法,把内部connection的query逻辑代理出去:

const mysql = require('mysql');
class Conexao {
  constructor() {
    this.connection = mysql.createConnection({
      host: 'localhost',
      user: 'root',
      password: '',
      database: 'agimplant'
    });
    this.connect()
  }
  connect() {
    this.connection.connect((err) => {
      if (!!err) {
        console.log("无法连接,错误码: ", err.code, ", 错误信息:", err.message)
      } else {
        console.log("Connected")
      }
    })
  }
  // 新增:封装query方法,代理到内部的connection对象
  query(sql, callback) {
    this.connection.query(sql, callback);
  }
}
module.exports = { Conexao }

修改后,你的Cargos类和路由代码都不需要改动,直接就能正常调用conexao.query了。

解决方案2:直接访问connection属性调用query

如果你不想修改Conexao类,也可以直接在getCargos里访问conexao的connection属性来调用query:

class Cargos {
  constructor() { }
  getCargos(conexao, callback) {
    console.log(conexao)
    // 改为访问connection属性下的query方法
    conexao.connection.query('select * from cargos', callback)
  }
}
module.exports = { Cargos }

额外建议

别忘了在请求处理完成后关闭数据库连接,避免连接泄漏问题。比如在路由的回调里添加关闭逻辑:

cargos.getCargos(conexao, (err, result) => {
  if (err) {
    res.json(err)
  } else {
    res.json(result)
  }
  // 处理完请求后关闭连接
  conexao.connection.end();
})

内容的提问来源于stack exchange,提问作者Tiago Silveira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:43:05