Node.js连接MySQL报ER_ACCESS_DENIED_ERROR空用户错误排查
问题根源
你遇到的参数不生效、一直返回空用户连接错误的核心原因是:你根本没有正确定义和传入数据库配置对象,createConnection方法从头到尾没拿到你写的连接参数,自然不管你怎么改配置里的账号密码都没用。
你代码里的语法错误有三个:
- 导入mysql模块时你给它起的别名就叫
SQL,后续你写的SQL: { ... }不是合法的变量定义语法,这个配置块根本不会被JS识别为有效变量 - 就算你是想给SQL对象挂载属性,对象内部的键值对之间也没加逗号分隔,本身就不符合JS对象语法
- 配置里的
database值你写的是'root',这是用户名不是数据库名,属于值填错的问题
修复方法
- 单独定义数据库配置对象,不要和导入的mysql模块重名,对象内部属性之间补全逗号分隔
- 把定义好的配置对象正确传入
createConnection方法 - 核对本地MySQL的实际root密码、已经创建好的目标数据库名,和配置值保持一致
修复后的完整参考代码:
import mysql from 'mysql'; // 单独定义配置,避免和导入的模块重名,属性之间必须加逗号分隔 const dbConfig = { host: 'localhost', user: 'root', password: '', // 填写你本地MySQL实际的root密码,没设置密码就留空 database: 'db' // 填写你已经创建好的、要连接的目标数据库名,不要填root }; function load() { // 传入正确的配置对象创建连接 const connection = mysql.createConnection(dbConfig); connection.connect((err) => { if(err) { console.log(err); process.exit(1); // 连接异常时用非0状态码退出是更规范的写法 } console.clear(); console.log('Successfully logged in!'); }); } load();
后续排查点
如果改完代码还是连接失败,按顺序检查:
- 本地MySQL服务是否已经正常启动,未启动的话先启动服务再运行代码
- 如果你给root用户设置过密码,
password字段必须填写对应正确值,不能留空 - 配置里填写的
database必须是你已经在MySQL里提前创建好的库,不存在的库会连接失败 - 如果你用的是MySQL 8.0及以上版本,默认的鉴权插件
caching_sha2_password不被旧版mysql包支持,可以替换为mysql2包使用,或者给数据库用户修改兼容的鉴权方式
你之前把密码改成随机值依然提示
using password: NO,就是因为你写的配置块完全没被JS识别,创建连接时根本没有传入密码参数,程序默认用空用户、无密码的方式发起连接,才会返回固定的报错。
内容的提问来源于stack exchange,提问作者Onyx
相关产品推荐
相关产品推荐

