我正在使用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 connection
和the tcp server
生效的方法在他们到达时执行queries
都会有很大的帮助。谢谢!
答案 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 ...
});