Node.js监听MySQL表操作遇认证模式错误的解决求助
解决@rodrigogs/mysql-events与MySQL 8.0的认证协议错误
1. 彻底确认MySQL用户的认证方式为mysql_native_password
@rodrigogs/mysql-events依赖的旧版mysql客户端完全不支持MySQL 8.0默认的caching_sha2_password认证,必须确保你的数据库用户使用mysql_native_password:
ALTER USER '你的用户名'@'你的主机' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;
执行后验证认证方式是否生效:
SELECT user, host, plugin FROM mysql.user WHERE user='你的用户名';
确认返回结果中plugin列的值为mysql_native_password。
2. 在Node.js连接配置中显式指定认证插件
即使用户认证方式已修改,旧客户端可能无法自动识别,需手动在连接选项中指定:
const mysql = require('mysql'); const MySQLEvents = require('@rodrigogs/mysql-events'); const connection = mysql.createConnection({ host: '你的主机地址', user: '你的用户名', password: '你的密码', authPlugin: 'mysql_native_password' // 关键配置项 }); const instance = new MySQLEvents(connection, { startAtEnd: true, excludedSchemas: { mysql: true } });
3. 修复依赖兼容性问题
@rodrigogs/mysql_events已多年未维护,其内置的mysql依赖版本过低,可手动强制升级兼容版本:
- 删除项目根目录下的
node_modules文件夹和package-lock.json文件 - 在
package.json中手动添加"mysql": "^2.18.1"(旧mysql包的最后稳定兼容版) - 重新执行
npm install
4. 替代方案:使用维护活跃的监听包
若上述方法仍无效,建议替换为基于mysql2的现代包(如mysql2-events),原生支持MySQL 8.0的认证机制:
const mysql = require('mysql2/promise'); const MySQLEvents = require('mysql2-events'); const run = async () => { const connection = await mysql.createConnection({ host: '你的主机地址', user: '你的用户名', password: '你的密码' }); const instance = MySQLEvents(connection, { startAtEnd: true }); await instance.addTrigger({ name: '表变更监控', expression: '你的数据库名.你的表名', statement: MySQLEvents.STATEMENTS.INSERT | MySQLEvents.STATEMENTS.UPDATE, onEvent: (event) => { console.log('捕获到变更:', event); } }); }; run();
内容的提问来源于stack exchange,提问作者Ioan
相关产品推荐
相关产品推荐

