首页 > 解决方案 > Node.js mysql 流查询被触发两次或更多次

问题描述

当我想将一块硬件(终端)添加到我的 mysql 数据库时,我有一个应用程序通过 SSH 连接到 MySQL 数据库。这是它的功能:

    const SSHConnection = new Promise(async (resolve, reject) => {
        sshClient.on('ready', async () => {
            sshClient.forwardOut(
            forwardConfig.srcHost,
            forwardConfig.srcPort,
            forwardConfig.dstHost,
            forwardConfig.dstPort,
            (err, stream) async => {
                 if (err) reject(err);
               
                // create a new DB server object including stream
                const updatedDbServer = {
                     ...dbServer,
                     stream
                };
                // connect to mysql
                const connection = mysql.createConnection(updatedDbServer);
                // check for successful connection
               //  resolve or reject the Promise accordingly          
               connection.connect(async (error) => {
                if (error) {
                    reject(error);
                }

                let query = await connection.promise().query("INSERT INTO `mandator_1`.`terminal` (`serialNumber`, `name`, `isActive`, `status`, `profileId`, `businessId`, `divisionId`, `ipAddress`, `groupId`, `setupVersion`, `macAddress`) VALUES ('" + terminal.serial + "', '" + terminal.serial + "', '1', NULL, '1', '1', NULL, '172.45.17.197', '1', NULL, '" + terminal.macAddress + "');");
                let updateTerminal = await connection.promise().query("UPDATE `terminal` SET `status` = UNIX_TIMESTAMP(NOW()) * 1000,  `setupVersion` = '005', `hardwareType` = '10', `update` = 0, `lastUpdated` = UNIX_TIMESTAMP(NOW()) * 1000, `dataReceived` = UNIX_TIMESTAMP(NOW()) * 1000 WHERE `setupVersion` IS NULL AND `hardwareType` IS NULL AND `lastUpdated` IS NULL AND `dataReceived` IS NULL AND `serialNumber` = '"+ terminal.serial +"'");

                resolve(connection);
                });
           });
        }).connect(tunnelConfig);
    });

如果我现在删除终端并添加另一个终端,则还会再次添加第一个终端。我觉得它有什么。与流/数据库连接有关。添加第一个终端后可能需要关闭或清除它?

标签: mysqlnode.jsnode-streams

解决方案


一般来说,不建议让连接保持打开状态,除非是类似终端​​的应用程序。您应该通过执行 connection.end() 确保在应用程序关闭后关闭连接,以防止资源泄漏。关闭连接将有效地断开第一个终端与数据库的连接,并且应该可以解决您的问题。请参阅链接以供参考: 何时使用 node-mysql 关闭 MySQL 连接?


推荐阅读