2016-04-13 8 views
0

Ich bin ein rest api mit node.js implementieren, die ssh2 package Tunneling verwendet, um die remote mysql database zu verbinden. Hier ist der Code, den ich per ssh verbinden bin mit und queryNode.js ssh2 tunnel am Leben und führen mysql Abfragen

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); 

jedoch auszuführen, wie Sie sehen können es nicht sehr effizient ist.

Für jede neue Abfrage stelle ich die Verbindung wieder her, starte den TCP Server und stoppe ihn nach der Abfrage. Jede Abfrage dauert etwa was wirklich schlimm ist. Alle Ansätze, die sowohl ssh connection als auch the tcp server am Leben erhalten, um queries auszuführen, wenn sie ankommen, wären eine große Hilfe. Vielen Dank!

Antwort

2

Wenn Sie den Datenbanktreiber direkt verwenden und mysql2 anstelle von mysql verwenden, können Sie den ssh-Weiterleitung-Stream tatsächlich als zugrunde liegende Verbindung übergeben, die vom Datenbanktreiber verwendet werden soll. Dadurch können Sie das Erstellen eines zusätzlichen Servers überspringen, der eingehende Verbindungen überwacht, die getunnelt werden sollen. So können Sie stattdessen Folgendes tun:

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 ... 
}); 
Verwandte Themen