[英]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 文件。
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;
現在從您的 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.