前言

为了网络安全起见,数据库和后端服务一般不会直接部署在同一台机器上,且一般也不允许直接用账户+密码的方式直接连接,通常采取的方案是通过 ssh 的方式进行连接。

项目已经封装成 npm 包:ssh2-connect-mysql

github 地址:ssh2-connect-mysql

步骤

  1. 建立 ssh 连接
  2. 与 mysql 建立连接
  3. 得到 mysql 操作句柄

实现方式

const client = require("ssh2").Client;
const mysql = require('mysql2');

const _client = new client();

// see config: https://github.com/mscdex/ssh2
const ssh_conf = {
  host: 'xxx.xxx.xx.1',
  port: 22,
  username: 'maria',
  privateKey: fs.readFileSync('/path/to/my/key')
};

// see config: https://github.com/sidorares/node-mysql2
const db_conf = {
  host: 'xxx.xxx.xx.2',
  user: 'realzzzdb',
  password: 'qwer123..',
  database: 'mydb'
};

// 建立 ssh 连接
_client.on("ready", function () {
    _client.forwardOut(
      "127.0.0.1",
      12345,
      db_config.host,
      db_config.port,
      function (err, stream) {
        if (err) {
          _client.end();
          return renject("Connection failed.");
        }

        // 得到 stream
        db_config.host = 'localhost';
        db_config.stream = stream;

        // 得到 mysql 的操作句柄
        _sql = mysql.createConnection(db_config);
        
      }
    ).connect(ssh_config); // ssh 连接的参数
  });

更好的使用,封装成 npm 包

npm package: ssh2-connect-mysql

github page: ssh2-connect-mysql