Node.js使用mysql模块连接MySQL失败,相同凭据可正常登录数据库
Node.js 连接MySQL报错排查方案
首先修改代码输出完整错误信息,原代码仅打印自定义提示无法定位根因,调整连接回调逻辑:
connection.connect(function(err){ if(err) { // 打印完整错误对象,通过错误码即可快速定位问题 console.log("Error in connecting Mysql", err); throw err; } else { console.log("Connected"); } });
根据打印的错误码对应处理即可,常见问题及解决方法如下:
- 错误码为 ER_NOT_SUPPORTED_AUTH_MODE
该错误由认证方式不兼容导致,旧版mysql依赖不支持MySQL 8.0+默认的caching_sha2_password认证协议,两种解决方法:- 替换依赖为适配新协议的
mysql2,执行命令npm install mysql2,再将引入代码修改为const mysql = require('mysql2')即可,原有业务逻辑无需调整 - 手动修改对应用户的认证插件,登录MySQL执行SQL:
ALTER USER 'mohit'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'abcd'; FLUSH PRIVILEGES; - 替换依赖为适配新协议的
- 错误码为 ER_ACCESS_DENIED_ERROR
该错误为权限校验失败,排查以下两点:- 原代码中port配置为字符串
'3306',修改为数字port: 3306避免类型解析异常 - MySQL中用户权限和host绑定,你本地客户端可正常登录大概率是使用了
localhost作为连接地址,而代码中使用127.0.0.1,二者在MySQL权限体系中是两个独立的配置,可直接将代码中host改为host: 'localhost',或者执行SQL给对应host的用户授权:
GRANT ALL PRIVILEGES ON sampleDb.* TO 'mohit'@'127.0.0.1'; FLUSH PRIVILEGES; - 原代码中port配置为字符串
- 错误码为 ECONNREFUSED
该错误为连接被拒绝,检查MySQL服务是否正常启动,以及MySQL配置文件中bind-address参数是否允许127.0.0.1访问。 - 无明确错误码仅提示超时
可在连接配置中增加超时参数,调整后重试:var connection = mysql.createConnection({ host : '127.0.0.1', user : 'mohit', password : 'abcd', database : 'sampleDb', port: 3306, connectTimeout: 10000 // 单位毫秒,设置10秒超时 });
内容的提问来源于stack exchange,提问作者Jayesh
相关产品推荐
相关产品推荐

