【问题标题】:NodeJS/mySQL - ER_ACCESS_DENIED_ERROR Access denied for user 'root'@'localhost' (using password: YES)NodeJS/mySQL - ER_ACCESS_DENIED_ERROR 用户'root'@'localhost'的访问被拒绝(使用密码:是)
【发布时间】:2017-03-21 12:44:55
【问题描述】:

我正在尝试通过 NodeJS 文件连接到 mySQL,但收到以下错误:

{ Error: ER_ACCESS_DENIED_ERROR: Access denied for user 'root'@'localhost' (using password: YES)
    at Handshake.Sequence._packetToError (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/protocol/sequences/Sequence.js:30:14)
    at Handshake.ErrorPacket (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/protocol/sequences/Handshake.js:67:18)
    at Protocol._parsePacket (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/protocol/Protocol.js:197:24)
    at Parser.write (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/protocol/Parser.js:62:12)
    at Protocol.write (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/protocol/Protocol.js:37:16)
    at Socket.ondata (_stream_readable.js:555:20)
    at emitOne (events.js:101:20)
    at Socket.emit (events.js:188:7)
    at readableAddChunk (_stream_readable.js:176:18)
    at Socket.Readable.push (_stream_readable.js:134:10)
    --------------------
    at Protocol._enqueue (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/protocol/Protocol.js:110:26)
    at Protocol.handshake (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/protocol/Protocol.js:42:41)
    at Connection.connect (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/Connection.js:81:18)
    at Connection._implyConnect (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/Connection.js:222:10)
    at Connection.query (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/Connection.js:137:8)
    at Object.<anonymous> (/home/matthew/Node/mySqlTest/index.js:11:12)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
  code: 'ER_ACCESS_DENIED_ERROR',
  errno: 1045,
  sqlState: '28000',
  fatal: true }

奇怪的是,我可以通过运行mysql -u root -p 通过终端正常连接。我只在运行我的 javascript 时收到此错误。我一直在使用 Google 和 StackOverflow,但仍然没有找到可行的解决方案。我在虚拟机上的 Ubuntu 16.04.1 上使用 MySQL 5.7.16。不确定VM是否在这里有所作为。我的 Javascript 代码如下:

'use strict';                                                                                                                                      

var mysql = require('mysql');

var connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'password'
});

connection.query(
    'SELECT "foo" AS first_field, "bar" AS second_field',
    function(err, results, fields) {
        console.log(err);
        console.log(results);
        connection.end();
    }
);

我尝试在我的 javascript 中使用“locahost”和“127.0.0.1”。我在 mySql.user 表中有一个 'localhost' 和 '127.0.0.1' 的 'root' 用户,我可以通过执行 SELECT user, host FROM mysql.user WHERE user='root'; 看到这一点

我通过执行以下命令为“root”用户添加了权限:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'password';

我也在 127.0.0.1 上运行了上述内容。我也试过这个:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION

我曾尝试像这样重置 root 密码: https://help.ubuntu.com/community/MysqlPasswordReset

每次尝试后我都运行FLUSH PRIVILEGES。我已经停止并重新启动了 mySQL。我已完全卸载 mySQL 并重新安装。

一切都无济于事。每次我尝试运行 javascript 时都会收到拒绝访问错误,但是当我通过终端连接到 mySQL 时完全没有问题。

有什么想法吗?

【问题讨论】:

  • 接下来我要做的是为您的应用创建一个不同的用户来与之交谈。无论如何,这是您应该做的事情,并且您的 mysql 实例中可能存在限制如何以 root 身份连接 - 也许是套接字与 tcp。
  • 我也试过了。创建新用户并授予所有权限。我收到同样的错误:“'newUser'@'localhost' 的访问被拒绝。
  • 我喜欢你在这个问题中描述细节的方式。完美!

标签: javascript mysql node.js ubuntu


【解决方案1】:

我也有同样的问题,我把密码改成空字符串解决了。

var mysql = require('mysql');
var connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: ''
});

【讨论】:

    【解决方案2】:

    创建新用户(而不是使用 root)解决了我的问题。

    mysql> CREATE USER 'new_user'@'%' IDENTIFIED BY 'password';
    Query OK, 0 rows affected (0.00 sec)
    

    然后授予:

    mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'new_user'@'%' WITH GRANT OPTION;
    

    然后更改凭据:

      var connection = mysql.createConnection({
        host     : 'The mysql IP',
        port     : 'The mysql Port',
        user     : 'new_iser',
        password : 'new_user_pass',
        database : 'database-name'
      }); 
    

    【讨论】:

    • 好收获!这也解决了我的问题。我正在使用 Vertrigo 服务器。
    【解决方案3】:

    尝试添加端口字段:

    var connection = mysql.createConnection({
       host: 'localhost',
       user: 'root',
       password: 'password',
       port: 3307
    });
    

    【讨论】:

    • 我不认为端口是问题 - 服务器通过拒绝访问来响应。
    • 工作就像一个魅力。如果您更改了默认端口,即 3306,则它是必需的!
    【解决方案4】:

    我遇到了类似的问题。我在 Docker 容器中运行 mysql,并且在尝试从我的节点应用程序连接到它时遇到了同样的错误。

    看来,我在没有暴露端口的情况下运行了 Docker 容器,因此容器内部是 3306,但无法通过 localhost:3306 访问。为什么我得到 ER_ACCESS_DENIED_ERROR 错误是因为我实际上在端口 3306 上运行了一些其他 mysql 服务器,使用不同的用户名和密码。

    查看您是否或在特定端口类型上运行了什么:

    ps axu | grep 3306
    

    由于我已经在端口 3306 上有了一些东西,为了使我的应用程序可以访问服务器,我将端口更改为 3307 并使用以下命令运行我的 docker mysql 容器:

    docker run --name=<name> -e MYSQL_ROOT_PASSWORD=<password> -p 3307:3306 -d mysql
    

    使用命令在 Docker 中启动 mysql 客户端后:

    docker exec -it <name> mysql -u root -p
    

    在创建要连接的数据库后,我可以使用以下几行从我的节点应用程序连接到我的 mysql 数据库:

     const connection = mysql.createConnection({
        host: 'localhost',
        user: 'root',
        password: 'password',
        database: 'database',
        port: 3307
     });
    
     connection.connect();
    

    希望对刚接触 docker 和 mysql 的人有所帮助 :)

    【讨论】:

    • 我遇到了这个问题。对于使用 Mac 的人,您可以使用sudo lsof -iTCP -sTCP:LISTEN -n -P | grep 3306 列出使用端口 3306 的任何进程(首先停止您的 docker 容器)。我不得不使用brew services stop mysql 来停止主机上的 mysqld 进程(杀死它只是让它以不同的 PID 重新启动)。
    【解决方案5】:

    问题不在于 mysql 用户身份验证。只是您必须授予您的节点应用程序访问 mysql 数据库。 我之前遇到过同样的问题。我添加了运行节点应用程序的端口号。现在它工作得很好。

    还有 user:"root" 写成 username:"root" 。注意拼写。

    const mysqlConnection = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "Pass@123",
    database: "employees",
    port:"3000",
    multipleStatements: true
    

    });

    我使用的是mysql版本“mysql”:“^2.18.1”。

    【讨论】:

    • 为什么你放的是node端口而不是mysql端口?这很有效,我对为什么感到震惊。
    【解决方案6】:

    对于 mysql 版本 2.16.0(2018 年 9 月):

    只需在 mysql 上创建一个新用户。

    GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';
    

    替换用户名和密码。

    【讨论】:

      【解决方案7】:

      有点晚了,但我想我发现了问题:密码中的特殊字符! 我有一个 $ 通行证。 解决方案:使用转义 例如:te\$t

      【讨论】:

      【解决方案8】:

      const pool = mysql.createPool({ host: 'localhost', user: 'root', database: 'database_name', password: 'your_pwd' });

      确保您已正确拼写键。我遇到了类似的问题,然后意识到我写的是 username 而不是 user

      【讨论】:

      • 这对我有帮助,我写了用户的使用 insted
      【解决方案9】:

      package.json 中使用最新的 MySQL 版本解决了这个问题。

      我使用的是 2.0.0 版。我将版本更改为 2.10.2。

      【讨论】:

      • 奇怪的是,我使用的是较新的 2.13.0 版本,但我遇到了同样的问题......“我每次尝试运行 javascript 时都会收到拒绝访问错误,但我绝对没有当我通过终端连接到 mySQL 时出现问题。”有什么想法吗?
      • 2.10.2 有同样的问题。 MySQL 版本是 5.7。
      • 2.16.0 还是有同样的问题
      • 有时会与“localhost”和“127.0.0.1”发生冲突。库使用 127.0.0.1 进行连接,不允许“localhost”MYSQL 用户
      【解决方案10】:

      我遇到了同样的问题,更改数据库用户的密码对我有用。请按照以下步骤操作:

      1. 打开MySQL Workbench

      2. 使用旧密码打开Local instance MySQL57

      3. 转到Server > Users and Privileges

      4. 更改密码,然后再次登录 MySQL。 OR 创建一个新用户并设置权限。 (如果更改密码不起作用。)

      【讨论】:

        【解决方案11】:

        //令人惊讶的是这有效。

        var mysql = require('mysql');
        var con = mysql.createConnection({
          host: "localhost",
          user: "root",
          password: ""
        });
        
        con.connect(function(err) {
          if (err) throw err;
          console.log("Connected!");
        });
        

        【讨论】:

          【解决方案12】:

          如果有人仍然面临问题。试试

          var mysql = require("mysql");
          var con = mysql.createConnection({
            host: "127.0.0.1",
            user: "your_username",
            password: "password",
            database: "your_db_name"
          });
          

          【讨论】:

            【解决方案13】:

            尝试 n 确保您用于登录数据库的凭据是正确的

            const Sequelize = require('sequelize')
            const db = {}
            const sequelize = new Sequelize('ochiengsDatabase', 'ochienguser', ' 
            mydbpassword', {
            host: 'localhost',
            dialect: 'mysql',
            operatorsAliases: false,
            

            【讨论】:

              【解决方案14】:

              您必须使用允许的主机部分的 IP 而非“localhost”的名称添加新用户

              // Do the mySQL Stuff
              var con = mysql.createConnection({
                host: 'localhost',
                user: 'user',
                password: 'mypwd',
                database: 'database',
                port: 3306,
                debug: true
              });
              
              //MYSQL Statement
              
              RENAME USER 'myuser'@'localhost' TO 'myuser'@'127.0.0.1';
              

              【讨论】:

                【解决方案15】:

                我遇到了同样的问题,但使用require('mariadb'),基本上是一样的。所以我的回答应该适用于两个司机。

                问题是 2 倍:

                • host: 'localhost', user: 'user' 在数据库中始终解析为 'user'@'127.0.0.1'。所以不要使用 localhost 而是使用 127.0.0.1

                • 客户端和服务器的密码加密方案不兼容,显然Node客户端使用mysql_native_password

                这是解决方案:(来自mysql 命令行客户端)

                # If you don't have a 127.0.0.1 equivalent user:
                CREATE USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'password';
                
                # If you already have the user, reset its password:         
                ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
                
                # Redo your grants on the 127.0.0.1 user:
                GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1';
                FLUSH PRIVILEGES;
                

                瞧,现在从 Node 连接,一切正常:

                const mariadb = require('mariadb'); // or require('mysql');
                
                const pool = mariadb.createPool({
                    host: 'localhost',  // or host: '127.0.0.1'
                    user: 'root',
                    password: 'password',
                    database: 'mydatabase',  // don't forget the database
                    port: 3306,
                    connectionLimit: 5
                });
                

                参考资料:

                Here's where I got the solution from, read for more info

                【讨论】:

                  【解决方案16】:

                  当我将 'root'@'localhost' 更改为 'root' 时,我在用户部分提供了完整的用户名,从而遇到了这个问题。现在可以正常工作了。

                  var mysql = require('mysql');
                  
                   var con = mysql.createConnection({
                    host: hostname,
                    user: "root",
                    password: "rootPassword"
                   });
                  
                   con.connect(function(err) {
                    if (err) throw err;
                    console.log("Connected!");
                   });
                  

                  【讨论】:

                  • 它的根目录和它不工作。请删除答案
                  【解决方案17】:

                  我在 nodejs 脚本中遇到了同样的错误,所以我删除了密码参数,现在它神奇地工作正常了

                  var mysql = require('mysql');
                  var connection = mysql.createConnection({
                      host: 'localhost',
                      user: 'root'
                  });
                  

                  【讨论】:

                    【解决方案18】:

                    my.ini中添加skip-grant-tables(该文件在mysql默认安装路径下)

                    [mysqld]

                    跳过授权表

                    端口=3306

                    【讨论】:

                      【解决方案19】:

                      对我来说,问题在于 SQL 连接对象 pass: 'mypassword' 而不是 password: 'mypassword'

                      【讨论】:

                        【解决方案20】:

                        问题主要在于 MySQL 服务器解释输入密码的方式。 请点击以下链接。它应该可以解决问题。 MySQL 8.0 - Client does not support authentication protocol requested by server; consider upgrading MySQL client

                        【讨论】:

                          【解决方案21】:

                          如果您从 localhost 连接到外部服务器,您可能需要将网关路由器地址添加到 MySQL 的“允许的主机”框中。

                          这个地址可以在错误信息中@符号后面找到:

                          Access denied for user 'your_username'@'blah.blah.blah.yourisp.com'
                          

                          【讨论】:

                            【解决方案22】:

                            大多数情况下,由于您设备上的 mySQL 配置错误,会发生这种情况。 我自己也有这个问题。我已经使用下面的链接解决了这个问题。

                            ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'db'

                            【讨论】:

                              【解决方案23】:

                              解决此问题的最佳解决方案:

                              您收到此错误:ER_NOT_SUPPORTED_AUTH_MODE 这是在安装 sql server 时提到的错误,您选择了“强身份验证”,但您设置了弱密码。您需要重置强密码或需要选择旧的身份验证方法。

                              按照这些步骤选择旧的身份验证方法...

                              您使用“mysql 安装程序”安装了 mysql 服务器

                              1. 打开“MySQL 安装程序”。

                              2. 点击快速操作下的“重新配置”MySQL 服务器。

                              3. 单击下一步可在“高可用性”下维护当前配置。

                              4. 单击下一步以维护“类型和网络”下的当前配置

                              5. 选择“身份验证方法”下的单选按钮“使用旧身份验证方法”,然后单击下一步。

                              6. 输入root账户密码并点击检查。稍等片刻验证密码,点击下一步。

                              7. 点击下一步应用配置并重启数据库服务器。

                              现在运行代码:

                              var mysql = require('mysql');
                              var connection = mysql.createConnection({
                              host: 'localhost',
                              user: 'root',
                              password: 'password'
                              

                              )};

                              密码字段应替换为root密码。

                              【讨论】:

                                【解决方案24】:

                                使用mysql -u root -p password登录你的mysql

                                创建新用户 z(MySQL 控制台)

                                CREATE USER 'z'@'localhost' IDENTIFIED BY '';
                                GRANT ALL PRIVILEGES ON * . * TO 'z'@'localhost';
                                

                                Node.js 脚本

                                var mysql = require('mysql');
                                
                                var con = mysql.createConnection({
                                    host: "localhost",
                                    user: "z",
                                    password: ""
                                });
                                
                                con.connect(function(err) {
                                
                                    if (err) throw err;
                                    console.log("Connected!");
                                
                                    con.query("use mysql;", function(err, result) {
                                        if (err) throw err;
                                        console.log(result);
                                    });
                                
                                    con.query("select * from user limit 1;", function(err, result) {
                                        if (err) throw err;
                                        console.log(result);
                                    });
                                
                                });
                                

                                【讨论】:

                                  【解决方案25】:

                                  您需要确保您使用的用户名与您在主机名下用于连接的 IP 地址相匹配。

                                  【讨论】:

                                    【解决方案26】:

                                    我在 mac 上遇到了同样的错误,但是每当我在 windows 机器上运行相同的代码时,它工作得非常好,没有任何错误。 花了 2 天后,我找到了解决方案。

                                    以下是我遵循的步骤。

                                    1. 到终端中的项目文件夹并运行“sudo su -”命令

                                    例如Avi-MBP:projectDirectory avisurya$ sudo su -

                                    1. 它将作为密码 例如密码:输入你的mac用户密码

                                    2. 现在你将在 root 例如Avi-MBP:~ root#

                                    3. 现在再次进入项目目录 例如Avi-MBP:~ root# cd /Users/avisurya/projectDirectory

                                    4. 现在启动节点应用程序 例如在我的情况下“节点 server.js”

                                    【讨论】:

                                      【解决方案27】:

                                      我通过在连接配置中添加套接字路径解决了这个问题。更多详情可以see here

                                      【讨论】:

                                        【解决方案28】:

                                        我今天遇到了同样的问题,这就是我所做的。您可能不需要选择其他密码,只需确保您的 js 文件中有正确的密码即可

                                        • 通过以下方式访问您的 mysql bash:
                                        $ sudo mysql
                                        
                                        • 修改root用户密码:
                                        mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your-chosen-password';
                                        
                                        • 通过Ctrl+D退出mysql
                                        • 确保您的 js 代码中使用相同的密码
                                        • 在 bash 中:
                                        $ mysql -u root -p
                                        
                                        • 输入您选择的密码 你应该可以看到mysql的欢迎信息

                                        • 退出并在 bash 中再次运行节点连接代码:

                                        $ node ./database/actions/db-connect.js
                                        

                                        确保您使用正确的密码

                                        【讨论】:

                                          【解决方案29】:

                                          确保您的配置文件中没有错误,我也努力进行排序,结果发现我一直在尝试使用错误的连接参数进行连接.. 错误代码是:

                                          require('dotenv').config()
                                              let  config= {
                                                  client: 'mysql2',
                                                  connection: {
                                                      host:process.env.MYSQL_HOST,
                                                      user:process.env.MYSQL_USER,
                                                      database:process.env.MYSQL_PASS, // here
                                                      password:process.env.MYSQL_DB,   //here
                                                      multipleStatements: true
                                                  }
                                              }
                                          
                                          module.exports= require('knex')(config);
                                          

                                          更正:

                                          require('dotenv').config()
                                              let  config= {
                                                  client: 'mysql2',
                                                  connection: {
                                                      host:process.env.MYSQL_HOST,
                                                      user:process.env.MYSQL_USER,
                                                      password:process.env.MYSQL_PASS, // here
                                                      database:process.env.MYSQL_DB,   //here
                                                      multipleStatements: true
                                                  }
                                              }
                                          
                                          module.exports= require('knex')(config)
                                          

                                          【讨论】:

                                            【解决方案30】:

                                            在我的情况下,为数据库播种时连接成功,但在启动服务器时却没有。奇怪!

                                            问题是服务器找不到.env文件,因为父目录与种子进程的父目录不同。

                                            require('dotenv').config({path: "../../.env"});
                                            

                                            我通过使用名为“app-root-path”的库解决了我的问题

                                            const appRoot = require('app-root-path');
                                            require('dotenv').config({path: appRoot + path.sep + ".env"});
                                            

                                            【讨论】:

                                              猜你喜欢
                                              • 1970-01-01
                                              • 2018-02-22
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 2013-06-11
                                              • 2013-11-03
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 2016-07-11
                                              相关资源
                                              最近更新 更多