【问题标题】:Node.js ssh2 tunnel keep alive and execute mysql queriesNode.js ssh2 隧道保持活动状态并执行 mysql 查询
【发布时间】:2016-08-05 00:28:35
【问题描述】:

我正在使用node.js 实现rest api,它使用ssh2 package 隧道连接到remote mysql database。这是我用来通过 ssh 连接并执行 query

的代码
executeQuery : function(query, callback) {
        var sshConnected = false;
        var connection = require('ssh2').Client();
        var server = require('net').createServer(function(sock) {
            if (!sshConnected) return sock.end();
            connection.forwardOut(
                '127.0.0.1',
                sock.remotePort,
                '127.0.0.1',
                3306,
                function (err, stream) {
                    if (err) return sock.end();
                    stream.pipe(sock).pipe(stream);
                });
        });
        connection.on('ready', function() {
            console.log('Client :: ready');
            sshConnected = true;
            server.listen(3306);
            var sqlconn = require('mysql').createConnection(config.dbOrg);
            sqlconn.connect(function (conError) {
                if (!conError) {
                    console.log(query);
                    sqlconn.query({sql: query.sql, values: query.values}, function (qError, results, fields) {
                        callback(qError, results, fields);
                    });
                } else {
                    callback(response.dbError, null, null);
                }
                server.close();
            });
        }).connect(config.sshConfig);

但是,正如您所见,它的效率不是很高。

对于每个新查询,我都会再次建立连接,启动 TCP 服务器并在查询后停止它。每个查询大约需要 3-4s 左右,这真的很糟糕。任何使ssh connectionthe tcp server 都处于活动状态以在queries 到达时执行它们的方法都会有很大帮助。谢谢!

【问题讨论】:

    标签: mysql node.js ssh tcp


    【解决方案1】:

    在直接使用数据库驱动的情况下,如果使用mysql2而不是mysql,实际上可以将ssh转发流作为底层连接传递给数据库驱动使用。这将允许您跳过必须创建一个额外的服务器来侦听要通过隧道传输的传入连接。所以你可以这样做:

    var mysql = require('mysql2');
    var Client = require('ssh2').Client;
    
    var ssh = new Client();
    ssh.on('ready', function() {
      ssh.forwardOut(
        '127.0.0.1',
        12345,
        '127.0.0.1',
        3306,
        function (err, stream) {
          if (err) throw err;
          var sql = mysql.createConnection({
            user: 'foo',
            database: 'test',
            stream: stream // <--- this is the important part
          });
          // use sql connection as usual
      });
    }).connect({
      // ssh connection config ...
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多