javascript - 如何在 require() 之后更改所需的连接

标签 javascript mysql node.js node-modules

在我当前正在处理的 Node.js 项目中,MySQL 服务器在空闲一段时间后关闭连接。我实现了一个错误处理程序,它在这种连接丢失后重新连接。错误处理有效,但我找不到一种方法来获取在使用新连接之前已经需要连接的文件。

我已尝试删除缓存,但这并不能解决我的问题。

var mysql = require('mysql');
var mysqlConfig = require('./mysqlConfig');
var connection;

function handleDisconnect() {
    connection = mysql.createConnection(mysqlConfig.db);

    connection.connect((err) => {
        if (err) {
            console.log("error on connection to Database: " + err);
            setTimeout(handleDisconnect, 1000);
        }
    });

    connection.on('error', (err) => {
        delete require.cache[require.resolve('./db.js')]; //this module
        if (err.code === 'PROTOCOL_CONNECTION_LOST') {
            handleDisconnect();
        } else {
            throw err;
        }
    });
}

handleDisconnect();

module.exports = connection;

以下是需要此模块的文件示例:

var db = require('../db');
var connector = {};

connector.GetStuff = function(query) {
    return new Promise((resolve, reject) => {
        let response = {};
        db.query(query, (error, results, fields) => {
            if (error) throw error;
            if (results && results.length > 1) {
                response = results[0];
                resolve(response);
            }
        })
    })
}

我想用新的连接对象替换以前需要的连接对象。但实际上我的应用程序崩溃并出现以下错误:

Error: Cannot enqueue Query after fatal error.

请不要告诉我只为每个查询打开一个新连接。由于客户的意愿,这是一个我无法使用的概念。

最佳答案

一个好的解决方案是不导出第一个文件中的连接对象,而是导出一些包装器或容器,其内容由连接故障处理函数定期更新。

class ConnectionContainer {
  setConnection(connection) {
    this.connection = connection;
  }

  getCurrentConnection() {
    return this.connection;
  }
}

const connectionContainer = new ConnectionContainer();

function handleDisconnect() {
    const connection = mysql.createConnection(mysqlConfig.db);

    connection.connect((err) => {
        if (err) {
            console.log("error on connection to Database: " + err);
            return setTimeout(handleDisconnect, 1000);
        } else {
          container.setConnection(connection); // set a new connection once it's connected
        }
    });

    connection.on('error', (err) => {
        delete require.cache[require.resolve('./db.js')]; // I don't think you need this anymore
        if (err.code === 'PROTOCOL_CONNECTION_LOST') {
            handleDisconnect();
        } else {
            throw err;
        }
    });
}

handleDisconnect();

module.exports.connectionContainer = connectionContainer;

// and in the connector file you could go like this:

const { connectionContainer } = require('../db'); // you might need a better name here for the file

//...
connectionContainer.getCurrentConnection().query(query, () => {});

关于javascript - 如何在 require() 之后更改所需的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55793637/

相关文章:

javascript - 我怎么能期望 Mocha 测试失败?

javascript - 我的 jQuery 函数互相破坏

python MySQL : how do loop through table and regex-replacing field?

MySQL - 包含 2 个相同外键列的表的 Select 语句

node.js - 如何配置我的 Nodejs 应用程序以仅响应 SSL 连接?

javascript - 如何在 vue.js 2 上获得 this.$store.dispatch 的响应?

java - 使用 jSoup 或其他库执行 JavaScript 后解析 HTML DOM

php - 使用 CDbMigration 更改表或重置自动增量

node.js - 使用socket.io确保多个应用程序实例上有唯一的socket.id

node.js - 我是否必须在需要使用 npm 命令的 bitbucket 管道中的每一步中进行 npm install