nodejs通過ssh連接mysql typescript

nodejs通過ssh連接mysql ts版本

核心講解

  1. 通過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是為了加載證書文件

  2. 通過mysql2連接數(shù)據(jù)庫
    mysql2有promise版本的我沒用畅铭,可以自己看看文檔。
    直接createConnection就連接上了勃蜘,然后可以通過query查詢數(shù)據(jù)硕噩。

  3. 如果是長期運行的項目,記得用完之后關(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']);

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市莹汤,隨后出現(xiàn)的幾起案子袱贮,更是在濱河造成了極大的恐慌,老刑警劉巖体啰,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件攒巍,死亡現(xiàn)場離奇詭異,居然都是意外死亡荒勇,警方通過查閱死者的電腦和手機柒莉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沽翔,“玉大人兢孝,你說我怎么就攤上這事窿凤。” “怎么了跨蟹?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵雳殊,是天一觀的道長。 經(jīng)常有香客問我窗轩,道長夯秃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任痢艺,我火速辦了婚禮仓洼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘堤舒。我一直安慰自己色建,他們只是感情好,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布舌缤。 她就那樣靜靜地躺著箕戳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪国撵。 梳的紋絲不亂的頭發(fā)上陵吸,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機與錄音卸留,去河邊找鬼。 笑死椭豫,一個胖子當著我的面吹牛耻瑟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赏酥,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼喳整,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了裸扶?” 一聲冷哼從身側(cè)響起框都,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呵晨,沒想到半個月后魏保,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡摸屠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年谓罗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片季二。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡檩咱,死狀恐怖揭措,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刻蚯,我是刑警寧澤绊含,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站炊汹,受9級特大地震影響躬充,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜兵扬,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一麻裳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧器钟,春花似錦津坑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至昙啄,卻和暖如春穆役,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梳凛。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工耿币, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人韧拒。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓淹接,卻偏偏與公主長得像,于是被迫代替她去往敵國和親叛溢。 傳聞我的和親對象是個殘疾皇子塑悼,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容