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

