[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
ただいまコメントを受けつけておりません。
所用で必要だったのでメモメモ。
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();
});
ただいまコメントを受けつけておりません。