nodejs通過ssh連接mysql ts版本
核心講解
通過ssh2建立連接
首先是 client.connect(),在連接成功后的onready事件中禽篱,通過forwardOut創(chuàng)建一個流对嚼,連接到遠程服務(wù)器上沟绪。
示例:
假設(shè)需要連接服務(wù)器 A上有一個3306的數(shù)據(jù)庫,但是本機無法直接連接迅细,只能通過服務(wù)器B作為跳板機再連接A湿痢。
那么這里的步驟就是,client.connect(服務(wù)器B) => client.forwardOut(本地->服務(wù)器A)
此時可以直接跟A通訊了
使用fs-extra是為了加載證書文件通過mysql2連接數(shù)據(jù)庫
mysql2有promise版本的我沒用畅铭,可以自己看看文檔。
直接createConnection就連接上了勃蜘,然后可以通過query查詢數(shù)據(jù)硕噩。如果是長期運行的項目,記得用完之后關(guān)閉連接缭贡,或者使用mysql的連接池管理炉擅。
import fse from 'fs-extra';
import mysql2 from 'mysql2';
import { Client } from 'ssh2';
const client = new Client();
let connection: mysql2.Connection;
let isConnected = false;
// ssh證書位置
const buffer: Buffer = fse.readFileSync(
'C:/Users/13152/Downloads/aliyun_jcly.pem'
);
export async function loadIdByGuid(
deviceGuids: Array<string>
): Promise<Map<string, number>> {
const conn = await connectToMysql();
const result: mysql2.RowDataPacket[] = await new Promise((resolve) => {
// 由于要拼一個in參數(shù)有多個?需要手動生成多個阳惹?
const defaultParams = deviceGuids
.map(() => {
return '?';
})
.join(',');
conn.query(
`SELECT id,device_guid,manufacturer_organization_id from device WHERE delete_flag=0 AND device_guid in (${defaultParams})`,
deviceGuids,
function (err, results: mysql2.RowDataPacket[], fields) {
resolve(results);
}
);
});
const map = new Map<string, number>();
result.forEach((element) => {
map.set(element['device_guid'], element['id']);
});
return map;
}
async function connectToMysql(): Promise<mysql2.Connection> {
return new Promise<mysql2.Connection>((resolve, reject) => {
if (isConnected) {
resolve(connection);
} else {
client
.connect({
host: '輸入遠程服務(wù)器地址',
port: 22,
username: '服務(wù)器登錄用戶名',
privateKey: buffer,//這里是用的密鑰登錄谍失,如果是密碼可以改成password
})
.on('ready', () => {
client.forwardOut(
'0.0.0.0',//源地址(填本機地址 可以是本地ip)
10018,//源端口 任意一個未使用的端口都可以
'數(shù)據(jù)庫主機所在地址可以是ip主機名等',//目的地址 (填需要連接的服務(wù)器地址)
3306,//目的端口
(err, stream) => {
connection = mysql2.createConnection({
port: 3306,
user: '數(shù)據(jù)庫用戶名',
password: '數(shù)據(jù)庫密碼',
database: '數(shù)據(jù)庫名',
stream: stream,
host: '數(shù)據(jù)庫主機名或者ip',
});
isConnected = true;
resolve(connection);
}
);
});
}
});
}
/**
* 關(guān)閉連接
*/
export function close(): void {
if (isConnected) {
connection.end();
client.end();
}
}
// loadIdByGuid(['90848425114210413044', '90872519116429488399']);