簡體   English   中英

MySQL 在 Nodejs 中使用 SSH 連接

[英]MySQL connection using SSH in Nodejs

我不明白如何通過 ssh 創建 mysql 連接並將其導出以從另一個文件訪問。 這是我的 database.js 文件,這里我創建了 ssh 隧道。 我需要從我的 controller 訪問 conn 變量。

const mysql = require("mysql2");
const { Client } = require("ssh2");
const { database, sshConfig, forwardConfig } = require("./keys");

// create an instance of SSH Client
const sshClient = new Client();

const connection = new Promise((resolve, reject) => {
  sshClient
    .on("ready", () => {
      sshClient.forwardOut(
        forwardConfig.srcHost,
        forwardConfig.srcPort,
        forwardConfig.dstHost,
        forwardConfig.dstPort,
        (err, stream) => {
          if (err) reject(err);
          const updatedDbServer = {
            ...database,
            stream,
          };
          var conn = mysql.createConnection(updatedDbServer);
          conn.connect(function (err) {
            if (err) {
              reject(err);
            } else {
              resolve(conn);
            }
          });
        }
      );
    })
    .connect(sshConfig);
});

module.exports = connection;

但是當我在 controller.js 文件中使用連接時,顯示“TypeError:connection.query 不是函數”

const connection = require("../db/database");
    
function getUsers(req, res) {
  try {
    let sqlQuery = `Select * from sUsers`;
    console.log(connection);
    connection().then((conn) => {
      // query database

      conn.query(sqlQuery, (error, results) => {
        if (error) {
          console.log(error);
          return;
        }
        res.json({
          ok: true,
          results,
        });
      });
    });
  } catch (err) {
    console.log(`Error1: ${err}`);
    return res.status(400).json({
      ok: false,
      err,
    });
  }
}

connection是 Promise。 您需要先等待它被解決或拒絕。 如果已解決,需要使用傳遞給then()處理程序的實際連接 object。

另外,我猜你打算在成功連接到數據庫服務器時執行resolve(conn)而不是resolve(connection) (並且return conn是不必要的,因為返回值被忽略)。

最后,因為module.exports是一個 object包含connection ,您要么需要更改為module.exports = connection; 或使用const { connection } = require("../db/database"); 在 controller.js 中。

使用 sql2 和 ssh2,建立 ssh db 連接。 確保您已經安裝了這兩個軟件包,並且在運行以下 controller 腳本之前,請連接到您的組織 vpn(如果有)。

將有三個文件:.env、SSHDBConfig js 和 controller js 文件。

  1. 創建包含所有必要主機名、用戶名、密碼數據的 dotenv 文件。
  2. 使用 sql2 和 ssh2 創建 SSHDBConfig.js 以形成通用連接。
   const mysql = require('mysql2');
   const { Client } = require('ssh2');
   const sshClient = new Client();
   const dbServer = {
   host: process.env.DB_HOST,
   port: process.env.DB_PORT,
   user: process.env.DB_USERNAME,
   password: process.env.DB_PASSWORD,
   database: process.env.DB_DATABASE
   }
   const sshTunnelConfig = {
       host: process.env.DB_SSH_HOST,
       port: 22,
       username: process.env.DB_SSH_USER,
       password: process.env.DB_SSH_PASSWORD
   }
   const forwardConfig = {
       srcHost: '127.0.0.1',
       srcPort: 3306,
       dstHost: dbServer.host,
       dstPort: dbServer.port
   };
   const SSHDBConnection = new Promise((resolve, reject) => {
       sshClient.on('ready', () => {
           sshClient.forwardOut(
               forwardConfig.srcHost,
               forwardConfig.srcPort,
               forwardConfig.dstHost,
               forwardConfig.dstPort,
               (err, stream) => {
                   if (err) reject(err);
                   const updatedDbServer = {
                       ...dbServer,
                       stream
                   };
                   const connection = mysql.createConnection(updatedDbServer);
                   connection.connect((error) => {
                       if (error) {
                           console.log("error---", error);
                           reject(error);
                       }
                       console.log("Connection Successful");
                       resolve(connection);
                   });
               });
       }).connect(sshTunnelConfig);
   });
   module.exports = SSHDBConnection;
  1. 現在從您的 controller 文件中,只需導入以上 ceated 連接並調用如下

    const myDBConnectionClient = require('./SSHDBConfig'); const dbCall = () => { myDBConnectionClient.then((conn) => { conn.query(`SQL_QUERY_STATEMENT`, (err, result, fields) => { if (err) throw err; console.log("SQL Query Result-- ", result); if (result.length;== 0) { //considering SQL Select statement result = result[0]; //perform your required work on result } }); }) } dbCall();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM