遇到一个Nodejs中的mysql连接问题,太奇怪了。

遇到一个Nodejs中的mysql连接问题,太奇怪了。

系统centos,确认root有密码,host为%,命令行中mysql -u root -p可以正常登录,局域网机器可以。

var mysql = require('mysql');

var conn = mysql.createConnection({
  host : 'localhost',
  user : 'root',
  password : 'xxxxx'
(隐去)
});

conn.connect(function (err) {

    if (err) console.log('connection error:', err);

});

运行上述代码就报错,把localhost换成.或者ip,都是相同的错误,求解释~

{ [Error: ER_ACCESS_DENIED_ERROR: Access denied for user 'root'@'localhost' (using password: NO)]
  code: 'ER_ACCESS_DENIED_ERROR',
  errno: 1045,
  sqlState: '28000',
  fatal: true }


9 回复

遇到一个Node.js中的MySQL连接问题,太奇怪了

背景信息

我在CentOS系统上使用Node.js连接MySQL数据库时遇到了一些问题。我已经确认MySQL的root用户有密码,并且可以通过命令行使用mysql -u root -p正常登录。此外,局域网内的其他机器也可以正常访问。

代码示例

以下是我在Node.js中尝试连接MySQL的代码:

var mysql = require('mysql');

var conn = mysql.createConnection({
  host : 'localhost',
  user : 'root',
  password : 'xxxxx' // 这里隐去了实际的密码
});

conn.connect(function (err) {
    if (err) console.log('connection error:', err);
});

错误信息

运行上述代码后,我收到了以下错误信息:

{
  [Error: ER_ACCESS_DENIED_ERROR: Access denied for user 'root'@'localhost' (using password: NO)]
  code: 'ER_ACCESS_DENIED_ERROR',
  errno: 1045,
  sqlState: '28000',
  fatal: true
}

问题分析与解决方案

从错误信息来看,问题在于MySQL认为我没有提供正确的密码,尽管我在连接配置中明确指定了密码。具体错误信息中的 (using password: NO) 表明在尝试连接时没有使用密码。

可能的原因:

  1. 密码设置问题: 确保在连接字符串中使用的密码与MySQL数据库中设置的密码完全一致。
  2. 配置文件问题: 检查是否有其他配置文件覆盖了密码设置。
  3. 权限问题: 确认root用户在localhost上的权限设置是否正确。

解决方案:

  1. 检查密码: 确认密码是否正确,可以在命令行中再次验证:

    mysql -u root -p
    

    输入密码后如果能够成功登录,说明密码是正确的。

  2. 使用完整路径: 如果仍然有问题,可以尝试使用完整的主机名或IP地址:

    var conn = mysql.createConnection({
      host : '127.0.0.1', // 或者你的实际IP地址
      user : 'root',
      password : 'xxxxx'
    });
    
  3. 检查权限: 登录到MySQL并检查root用户的权限设置:

    SELECT User, Host FROM mysql.user;
    

    确保root用户在localhost上有正确的权限。

通过以上步骤,你应该能够解决这个问题。如果仍然无法解决,请提供更多详细信息以便进一步诊断。


已解决,是版本问题,node-mysql2.1.0降级为2.0.1就好了,看来要指定版本安装了。

建议不要用root连数据库,可以新建用户连数据库。

奇怪了…我这里倒是很正常…

谢谢提醒,这里只做测试使用~

的确很奇怪,我用command line毫无问题,确定是库的原因,我也不知道啥情况~

升级 mysql 包的确解决了问题。

目前我用到的是mysql 2.15.0版本,也是有这个问题,希望有人能帮忙解决.

根据你提供的信息,错误提示 ER_ACCESS_DENIED_ERROR: Access denied for user 'root'@'localhost' (using password: NO) 表明在连接MySQL时没有正确传递密码。具体来说,mysql.createConnection 中的 password 字段可能没有被正确读取。

以下是一些可能的解决方案和检查步骤:

检查密码传递

确保你在 mysql.createConnection 中正确传递了密码:

var mysql = require('mysql');

var conn = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'xxxxx' // 确保这里是你设置的真实密码
});

conn.connect(function (err) {
  if (err) {
    console.log('connection error:', err);
  } else {
    console.log('Connected!');
  }
});

确认用户权限

确保MySQL中的 root 用户允许从 localhost 连接,并且使用密码进行验证。你可以通过执行以下SQL语句来检查:

SELECT User, Host FROM mysql.user;

确保 root 用户在 Host 列中有 localhost%。如果 Hostlocalhost,确保 root 用户允许使用密码连接:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'xxxxx' WITH GRANT OPTION;
FLUSH PRIVILEGES;

示例代码

将以上内容整理成完整的示例代码:

var mysql = require('mysql');

var conn = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'xxxxx' // 确保这里是你设置的真实密码
});

conn.connect(function (err) {
  if (err) {
    console.log('connection error:', err);
  } else {
    console.log('Connected!');
  }
});

通过以上步骤,你应该能够解决 ER_ACCESS_DENIED_ERROR 错误。如果问题仍然存在,请检查是否有其他安全策略或防火墙规则阻止了连接。

回到顶部