我不明白如何通过ssh创建mysql连接并将其导出以从另一个文件访问。这是我的database.js文件,我在这里创建了ssh隧道。我需要访问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文件中使用connection时,显示我"TypeError: connection。查询不是函数">
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
是一个承诺。你需要先等待它被解决或拒绝。如果解决了,那么您需要使用传递给then()
处理程序的实际连接对象。
此外,我猜你的意思是做resolve(conn)
而不是resolve(connection)
当你成功连接到数据库服务器(和return conn
是不必要的,因为返回值被忽略)。
最后,因为module.exports
是一个对象包含connection
,你要么需要更改为module.exports = connection;
或使用const { connection } = require("../db/database");
在controller.js。
使用sql2和ssh2建立ssh db连接。确保您已经安装了这两个包,并且在运行以下控制器脚本之前,请连接到您的组织vpn(如果有的话)。
将有三个文件:.env, SSHDBConfig js和controller js文件。
- 创建包含所有必要的主机名,用户名,密码数据的dotenv文件
- 创建SSHDBConfig.js,通过sql2和ssh2建立通用连接。
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;
现在从控制器文件中导入上面创建的连接,并按如下方式调用
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();