如何通过Node.js访问Plesk服务器上的MySQL数据库
解决Node.js通过SSH隧道连接Plesk MySQL失败的问题
我帮你梳理下你遇到的核心问题:MySQL Workbench能通过「Standard TCP/IP over SSH」(无私钥,密码认证)连接数据库,但Node.js 8.11.1用两种SSH隧道方案都报错。下面针对你尝试的两个方案逐一排查并给出修复方案:
方案1:修复mysql-ssh的连接错误
你遇到的All configured authentication methods failed错误,核心原因是你给mysql-ssh传了私钥配置,但你的SSH连接实际是用密码认证的(Workbench没用到私钥)。mysql-ssh默认优先使用密钥认证,当服务器不接受密钥时,又没有提供密码选项,就会握手失败。
修正后的代码(用密码认证SSH)
const mysqlssh = require('mysql-ssh'); // 注意:不要传privateKey字段,改用password mysqlssh.connect( { host: '你的SSH主机地址', // 和Workbench里的「SSH Hostname」一致 user: '你的SSH用户名', // 和Workbench里的「SSH Username」一致 password: '你的SSH密码' // Workbench里的「SSH Password」 }, { host: '127.0.0.1', // Plesk的MySQL默认绑定本地回环,不要填公网地址 user: '你的MySQL用户名', password: '你的MySQL密码', database: '目标数据库名' } ) .then(client => { // 测试查询 client.query('SELECT 1 AS test', (err, results) => { if (err) throw err; console.log('查询结果:', results); mysqlssh.close(); // 关闭连接 }); }) .catch(err => { console.error('连接失败:', err.message); // 捕获所有错误,避免崩溃 });
方案2:修复mysql2 + ssh2的连接错误
你遇到的UnhandledPromiseRejectionWarning和ECONNRESET错误,主要是两个问题:
- 没有正确处理Promise的错误(缺少
.catch()或try/catch) - SSH连接配置错误(默认尝试密钥认证,而非密码)
修正后的代码(带完整错误处理+密码认证)
const { Client: SSHClient } = require('ssh2'); const mysql = require('mysql2/promise'); // SSH配置(和Workbench的SSH参数一致) const sshConfig = { host: '你的SSH主机地址', port: 22, // 若服务商改了SSH端口,替换成对应值 username: '你的SSH用户名', password: '你的SSH密码' // 核心:用密码认证,不要私钥 }; // MySQL配置(和Workbench的MySQL参数一致) const mysqlConfig = { host: '127.0.0.1', // Plesk MySQL本地地址 user: '你的MySQL用户名', password: '你的MySQL密码', database: '目标数据库名' }; const sshClient = new SSHClient(); // 监听SSH连接错误 sshClient.on('error', (err) => { console.error('SSH连接出错:', err.message); sshClient.end(); }); // SSH连接成功后创建隧道 sshClient.on('ready', async () => { console.log('SSH隧道已建立'); try { // 转发本地请求到服务器的MySQL端口(默认3306) const stream = await new Promise((resolve, reject) => { sshClient.forwardOut( '127.0.0.1', // 本地绑定地址 0, // 自动分配本地端口 '127.0.0.1', // 服务器上MySQL的地址 3306, // MySQL端口 (err, stream) => { if (err) reject(err); else resolve(stream); } ); }); // 通过隧道连接MySQL const connection = await mysql.createConnection({ ...mysqlConfig, stream // 用SSH隧道流代替TCP连接 }); // 测试查询 const [rows] = await connection.execute('SELECT 1 AS test'); console.log('MySQL查询成功:', rows); // 关闭连接 await connection.end(); sshClient.end(); } catch (err) { console.error('操作出错:', err.message); sshClient.end(); } }); // 启动SSH连接 sshClient.connect(sshConfig);
通用注意事项(针对你的Node.js 8.11.1版本)
- 版本兼容:Node.js 8.x属于老版本,安装依赖时要指定兼容的版本号,避免新版依赖不兼容:
npm install mysql-ssh@1.0.6 ssh2@0.8.9 mysql2@1.6.5 - Plesk权限确认:确保你的MySQL用户允许从
localhost访问(Plesk创建的用户默认已配置),且SSH用户有足够权限创建隧道。 - 错误捕获:所有异步操作必须加错误捕获(
.catch()或try/catch),否则Node.js 8.x会因为未处理的Promise拒绝而崩溃。
内容的提问来源于stack exchange,提问作者Matthias Nowakowski
相关产品推荐
相关产品推荐

