忍者ブログ

ひつ(じのひよこが)プログラミングします。
お仕事や趣味で困ったこととか、何度も「あれ?どうだったかしら」と調べたりしたこととか、作ったものとか、こどものこととかを書きます
★前は週末定期更新でしたが今は不定期更新です

2024/05    04« 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  »06

node.js で mysql に ssh tunnel して接続する

所用で必要だったのでメモメモ。

const MYSQL = require('mysql'); // 事前に npm install しておく
const TUNNEL = require('tunnel-ssh'); // 事前に npm install しておく
const FS = require('fs');

// 経由するサーバに SSH するための情報。無論適宜変える事
const sshParam = {
  username: 'hiyoko',
  host: '192.168.22.17',
  port: 22,
  privateKey: FS.readFileSync('hiyoko-server.pem'),
  dstPort: 3306,
  localhost: 'localhost',
  localPort: 3306
};

// mysql サーバに接続するための情報。無論適宜変える事
const mysqlParam = {
  host: 'mysql.hiyoko.example.com',
  user: 'mysql-user',
  password: 'myStrongestPassword',
  database: 'hiyoko' // 特定の DB に入りたいわけでないのであれば書かない
};

const connectToDb = (connection) => {
  return new Promise((resolve, reject)=> {
    connection.connect((dbConnectErr)=>{
      if(dbConnectErr) {
        console.error('DB への接続に失敗したよ');
        reject(dbConnectErr);
      } else {
        console.log(`DB に接続できたよ スレッド ID は ${connection.threadId}`);
        resolve(connection);
      }
    });
  });
};

const disconnectFromDb = (connection) => {
  return new Promise((resolve, reject)=> {
    connection.end((dbDisconnectErr)=> {
      if(dbDisconnectErr) {
        console.error('DB との切断に失敗したよ');
        reject(dbDisconnectErr);
      } else {
        console.log('DB と切断したよ');
        resolve(connection);
      }
    });
  });
};

const requestQuery = (connection, sql) => {
  return new Promise((resolve, reject)=> {
    connection.query(sql, (requestErr, results, fields)=> {
      if(requestErr) {
        console.error(`DB へのリクエスト ${sql} が失敗したよ`);
        reject(requestErr);
      } else {
        resolve({
          results: results,
          fields: fields
        });
      }
    });
  });
};

const sshTunnel = TUNNEL(sshParam, async (sshErr, tunnel)=> {
  if(sshErr) {
    throw sshErr;
  }
  const connection = MYSQL.createConnection(mysqlParam);
  await connectToDb(connection);

  /* 以下で DB の処理とかをがちゃがちゃ */
  const queryResult = await requestQuery(connection, 'select * from aTable;');
  console.log(queryResult);

  /* 終わったら切断する */
  await disconnectFromDb(connection);
  sshTunnel.close();
});
PR

コメント

ただいまコメントを受けつけておりません。

ブログ内検索

P R