mysql - 跨文件共享变量,而无需在 Node.js 中创建它们的副本

标签 mysql node.js

我的 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/

相关文章:

node.js - 如何在不读取标准输入的情况下使用 `npm login` 设置 npm 凭据?

node.js - Node : Parallelism of async module

javascript - 为什么这个简单的 Node 程序不是非阻塞的?

MySQL 在两个不同字段上的搜索查询

mysql - #1064 - 创建 View 时 SQL 语法有错误

node.js - 访问 Express 中间件中的模块实例

http - 服务器端http请求无限重定向

mysql - SQL - 如果另一个表存在则删除行

php - MySQL 计数包含到 json 对象

java - Java函数中的SQL语句