我的 mysql 连接在 database.js
中,还有一个断开处理程序,用于在连接断开时重新启动连接。看起来像这样:
const mysql = require('mysql');
function handleDisconnect() {
con = mysql.createConnection({
host: "host",
user: "user",
password: "pass",
database: "db",
debug: false
});
con.connect(function(err) {
if(err) {
setTimeout(handleDisconnect, 2000, con);
}
});
con.on('error', function(err) {
if(err.code === 'PROTOCOL_CONNECTION_LOST') {
handleDisconnect();
} else {
throw err;
}
});
}
handleDisconnect();
module.exports = {
con,
}
我想在多个文件中使用相同的连接。例如在 test.js
中:
var con = require('database.js').con;
con.query(sql, function (err, result) {
if (err) {
console.log("ERROR");
}
});
但是,这会创建连接的本地副本,并且当连接断开时,handleDisconnect
函数不会重新启动此连接。
解决这个问题的最佳方法是什么?
最佳答案
对象是通过指针共享的,因此只要您始终通过对象引用 .con
属性,并且只要操作 con
属性的人也会更改该属性在导出的对象中,它应该可以工作。因此,将您的导入代码更改为:
var dbInfo = require('database.js');
dbInfo.con.query(sql, function (err, result) {
if (err) {
console.log("ERROR");
}
});
然后,只要 con
属性更新,只要您通过 dbInfo
对象引用它(并且不要创建自己的本地副本),您就可以将看到导出属性的最新值。
当您这样做时,dbInfo
指向您在源模块中导出的完全相同的对象。因此,如果您的源模块更改或更新该对象上的 .conn
属性,则与您共享该对象的任何其他模块也将看到该更新的属性。
请注意,您必须更改导出模块中的代码,以便导出的对象也能保持最新的 con
值。您需要保存导出的对象的副本(或从 module.exports
引用它),并确保 module.exports.con
始终具有最新值你希望每个人都使用。不要将新对象分配给module.exports
。只需更新已存在的对象上的 .con
属性,因为那是已导出的对象。
function handleDisconnect() {
con = module.exports.con = mysql.createConnection({
host: "host",
user: "user",
password: "pass",
database: "db",
debug: false
});
<小时/>
如果您需要动态地准确了解连接何时发生变化,您可以导出一个 EventEmitter
对象,并在 conn
值发生变化时在该发射器上发出一个事件,以便任何使用它的人可以监听该事件并动态地知道该值何时更新。
关于mysql - 跨文件共享变量,而无需在 Node.js 中创建它们的副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59774840/