gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:44:50 29 4
gpt4 key购买 nike

我正在使用 node.js 实现一个 rest api,它使用 ssh2 包 隧道连接到 远程 mysql 数据库。这是我用来通过 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 连接tcp 服务器 事件以在它们到达时执行 queries 的方法都会有很大帮助。谢谢!

最佳答案

在直接使用数据库驱动的情况下,如果使用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 ...
});

关于mysql - Node.js ssh2隧道保活并执行mysql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36606374/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com