Node.js ssh2隧道保持活动并执行mysql查询

时间:2016-04-13 18:15:06

标签: mysql node.js ssh tcp

我正在使用rest api使用node.js隧道连接到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都会有很大的帮助。谢谢!

1 个答案:

答案 0 :(得分:5)

如果直接使用数据库驱动程序,如果使用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 ...
});