Node.js类中获取MySQL连接threadId问题求助
解决Node.js中MySQL连接threadId无法访问的问题
问题根源
你的代码里有两个核心问题导致拿不到threadId:
- this指向错误:
connectionCallbackMysql作为回调函数传入connect时,函数内部的this不再指向DBConnectionMySql的实例,而是变成了调用它的上下文(严格模式下会是undefined),所以this.mysqlobj自然取不到值。 - 访问时机没问题,但上下文错了:threadId确实是在连接握手成功后被赋值到连接对象上的,但你没在正确的上下文中访问它。
修复方案
方案1:用箭头函数绑定回调的this
把connectionCallbackMysql改成箭头函数,它会自动继承类实例的this:
module.exports = class DBConnectionMySql{ // ... 其他属性省略 connectionCallbackMysql = (err, ...args) => { if (err) throw new DBerror(err.code) console.log("This thread connection " + this.mysqlobj.threadId); } connection(){ this.mysqlobj.connect(this.connectionCallbackMysql); } // ... 其他方法省略 }
方案2:传递回调时绑定this
如果不想修改回调函数的写法,在调用connect时用bind绑定类实例的this:
connection(){ this.mysqlobj.connect(this.connectionCallbackMysql.bind(this)); }
方案3:直接使用匿名箭头函数
也可以省去单独的回调方法,直接在connect里写匿名箭头函数:
connection(){ this.mysqlobj.connect((err) => { if (err) throw new DBerror(err.code) console.log("This thread connection " + this.mysqlobj.threadId); }); }
关于threadId的必要性
threadId是MySQL连接的唯一标识,大部分业务场景下你不需要直接使用它——执行SQL、断开连接等常规操作都不依赖它。只有在特殊场景(比如手动终止某个异常连接、调试连接池问题)才会用到它。所以如果你的业务逻辑不需要这个值,暂时访问不到也不会影响功能;但如果确实需要,按照上面的方法修复后就能正常获取。
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

