2016-04-13 26 views
0

remote mysql databaseに接続するためにssh2 packageトンネリングを使用するnode.jsを使用してrest apiを実装しています。ここで私はssh経由で接続するために使用していますが、あなたはそれが非常に効率的ではありません見ることができるように、しかしqueryNode.js ssh2トンネルを有効にしてmysqlクエリを実行

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を実行すると大きな助けになります。ありがとう!

答えて

2

データベースドライバを直接使用する場合、mysqlの代わりにmysql2を使用すると、実際に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 ... 
});