【问题标题】:MySQL 8.0 - Client does not support authentication protocol requested by server; consider upgrading MySQL clientMySQL 8.0 - 客户端不支持服务器请求的认证协议;考虑升级 MySQL 客户端
【发布时间】:2018-10-10 02:44:02
【问题描述】:

由于某种原因,我无法与服务器建立简单的连接。我使用默认设置安装了最新的 MySQL Community 8.0 数据库和 Node.JS。

这是我的 node.js 代码

    var mysql = require('mysql');

    var con = mysql.createConnection({
      host: "localhost",
      user: "root",
      password: "password",
      insecureAuth : true
    });

    con.connect(function(err) {
      if (err) throw err;
      console.log("Connected!");
    });

以下是在命令提示符中发现的错误:

C:\Users\mysql-test>node app.js
    C:\Users\mysql-test\node_modules\mysql\lib\protocol\Parse
    r.js:80
            throw err; // Rethrow non-MySQL errors
            ^

Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
    at Handshake.Sequence._packetToError (C:\Users\mysql-
test\node_modules\mysql\lib\protocol\sequences\Sequence.js:52:14)
    at Handshake.ErrorPacket (C:\Users\mysql-test\node_mo
dules\mysql\lib\protocol\sequences\Handshake.js:130:18)
    at Protocol._parsePacket (C:\Users\mysql-test\node_mo
dules\mysql\lib\protocol\Protocol.js:279:23)
    at Parser.write (C:\Users\mysql-test\node_modules\mys
ql\lib\protocol\Parser.js:76:12)
    at Protocol.write (C:\Users\mysql-test\node_modules\m
ysql\lib\protocol\Protocol.js:39:16)
    at Socket.<anonymous> (C:\Users\mysql-test\node_modul
es\mysql\lib\Connection.js:103:28)
    at Socket.emit (events.js:159:13)
    at addChunk (_stream_readable.js:265:12)
    at readableAddChunk (_stream_readable.js:252:11)
    at Socket.Readable.push (_stream_readable.js:209:10)
    --------------------
    at Protocol._enqueue (C:\Users\mysql-test\node_module
s\mysql\lib\protocol\Protocol.js:145:48)
    at Protocol.handshake (C:\Users\mysql-test\node_modul
es\mysql\lib\protocol\Protocol.js:52:23)
    at Connection.connect (C:\Users\mysql-test\node_modul
es\mysql\lib\Connection.js:130:18)
    at Object.<anonymous> (C:\Users\mysql-test\server.js:
11:5)
at Module._compile (module.js:660:30)
at Object.Module._extensions..js (module.js:671:10)
at Module.load (module.js:573:32)
at tryModuleLoad (module.js:513:12)
at Function.Module._load (module.js:505:3)
at Function.Module.runMain (module.js:701:10)

我已经阅读了一些内容,例如: https://dev.mysql.com/doc/refman/5.5/en/old-client.html https://github.com/mysqljs/mysql/issues/1507

但我仍然不确定如何解决我的问题。任何帮助将不胜感激:D

【问题讨论】:

  • 所有使用 SQLTools 扩展的 VS Code 用户都应该参考这篇文章,以防他们遇到问题,特别是如果您刚刚在开发计算机上升级了 mysql 实例
  • 我遇到了同样的问题,因为我在连接时使用了端口 3306,但是当我安装 MySQL 时,我将默认端口设置为 3307。所以要小心,这也可能是协议不匹配。
  • 您应该考虑将接受的答案更改为 Aidin 的。

标签: mysql node.js


【解决方案1】:

如果你同时使用pm2和mysql2仍然出现这个错误

检查正在运行的 PM2 进程

pm2 kill
pm2 start ecosystem.config.js

这对我有用。

【讨论】:

    【解决方案2】:

    您应该为会话使用用于 mysql 连接的任何架构

    (async () => {
        const connection = await db.connection();
        sessionStore = new MySQLStore({
    
        }, connection); //just pass your connection here 
    })();
    
    

    我只是在这里复制粘贴,但您可能已经实现了类似的东西来处理您的查询

    const mysql = require('mysql')
    
    if (!process.env.NODE_ENV || process.env.NODE_ENV === 'development') {
        require('dotenv').config();
    }
    
    const dbConfig = {
        host: process.env.DB_HOST,
        user: process.env.DB_USER,
        password: process.env.DB_PASSWORD,
        database: process.env.DB_DATABASE,
        connectionLimit: process.env.DB_CONNECTION_LIMITS
    }
    
    const pool = mysql.createPool(dbConfig);
    
    const connection = () => {
        return new Promise((resolve, reject) => {
            pool.getConnection((err, connection) => {
                if (err) {
                    reject(err);
                }
    
                const query = (sql, binding) => {
                    return new Promise((resolve, reject) => {
                        connection.query(sql, binding, (err, result) => {
                            if (err) {
                                reject(err);
                            }
                            resolve(result);
                        });
                    });
                };
    
                const release = () => {
                    return new Promise((resolve, reject) => {
                        if (err) {
                            reject(err);
                        }
                        resolve(connection.release());
                    });
                };
                resolve({ query, release });
            });
        });
    };
    
    const query = (sql, binding) => {
        return new Promise((resolve, reject) => {
            pool.query(sql, binding, (err, result, fields) => {
                if (err) {
                    reject(err);
                }
                resolve(result);
            });
        });
    };
    
    module.exports = { pool, connection, query };
    
    

    【讨论】:

      【解决方案3】:

      总结

      1. 如果您只是想摆脱错误,以冒项目安全为代价(例如,它只是一个个人项目或开发环境),请使用@Pras's answer -- ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password' 然后flush privileges
      2. 如果您想修复它,但不知道为什么,只需安装并使用 mysql2(而不是 mysql)并使用它 -- npm i mysql2mysql = require('mysql2');
      3. 如果您是一个好奇的开发人员,总是渴望学习,请继续阅读... :)

      发生了什么事?

      让我们先弄清楚发生了什么。

      MySQL 8 支持可插入的身份验证方法。默认情况下,使用其中一个名为caching_sha2_password 而不是我们的旧mysql_native_password (source)。很明显,使用多次握手的加密算法比 24 years 的普通密码传递更安全!

      现在,问题是 Node 中的 mysqljs(您使用 npm i mysql 安装并在您的 Node 代码中使用它的软件包)还不支持 MySQL 8 的这种新的默认身份验证方法。问题在这里:https://github.com/mysqljs/mysql/issues/1507,并且在 3 年后,截至 2019 年 7 月仍然开放。

      2019 年 6 月更新:现在有一个 new PR in mysqljs 来解决这个问题!

      2020 年 2 月更新:显然是 scheduled to come in version 3 of mysqljs

      2020 年 7 月更新: 显然它仍然不在 yet (as of April 2020 at least),但它是 claimed node-mysql2 支持 Authentication switch request。如果node-mysql2 可以很好地解决这个问题,请在下方评论——我稍后会自己测试。

      2021 年 4 月更新: 问题似乎仍然存在,就在 3 天前,someone created a fork 并在那里解决了问题——但在 mysql.js 包中尚未正式发布。此外,根据下面的 cmets,似乎 mysql2 package 工作正常,supporting Authentication-switch 正常。


      您当前的选择

      选项 1) [不推荐] 降级“MySQL”以使用旧的“mysql_native_password”进行身份验证

      这就是这里每个人的建议(例如top answer above)。你只需进入mysql 并运行一个查询说root 可以使用旧的mysql_native_password 方法进行身份验证:

      ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password ...
      

      好消息是,生活将变得简单,您仍然可以在没有any issue 的情况下使用像 Sequel Pro 这样的好旧工具。但问题是,您没有利用更安全(而且很酷,请阅读下文)提供给您的东西。

      选项 2) [嗯...] 用 MySQL Connecter X DevAPI 替换“Node”包

      MySQL X DevAPI for NodeNode's Mysqljs package的替代品,由http://dev.mysql.com官方提供。

      它就像一个支持caching_sha2_password 身份验证的魅力。 (只需确保将端口 33060 用于 X Protocol communications。)

      糟糕的是,你留下了我们旧的mysql 包,每个人都如此习惯和依赖。

      好消息是,您的应用现在更加安全,您可以利用我们的老朋友没有提供的大量新功能!只需查看tutorial of X DevAPI,您就会发现它拥有大量可以派上用场的性感新功能。你只需要付出学习曲线的代价,任何技术升级都会出现这种情况。 :)

      PS。不幸的是,这个 XDevAPI 包还没有类型定义(TypeScript 可以理解),所以如果你使用 typescript,你会遇到问题。我尝试使用dts-gendtsmake 生成.d.ts,但没有成功。所以请记住这一点。

      选项 3) [推荐] 将“mysql.js”替换为“mysql2.js”包

      如上所述,mysql 包(NPM package link)为still having this issue(截至 2021 年 4 月)。但是 mysql2 包 (NPM package link) 不是。所以可能以下应该是单行答案!

      npm un mysql && npm i mysql2
      

      请注意,mysql2 是流行的 mysql 的分叉作品,但其受欢迎程度(2020 年 4 月 mysql2 每周下载 62 万次)已接近原始软件包(每周 72 万次下载mysql 2021 年 4 月)进行转换似乎是合理的!

      干杯!

      【讨论】:

      • 很好,一个实际上解释了 mysql_native_password 而不仅仅是告诉你这样做的答案
      • 是的,一次正确的解释。对你好艾丁。我多么希望连接应用程序不会自动将端口 3306 配置到 MySQL。我们很难将 MySQL 和 MariaDB 从 3306 中取出。
      • @emen,如果您不习惯阅读库代码(代替适当的文档),或者您需要引入 Typescript,或者安全性对您的项目来说不是危及生命的问题,那么不,不要选择选项#2。 :)
      • 感谢@Henrique 提供的详细信息。是的,它不应该是一个答案,除非您采用 stackoverflow 的答案,例如:pics.me.me/… ;)
      • mysql2 优雅地解决了这个问题。我认为这是最合适的解决方案。
      【解决方案4】:

      降级可能不是一个好的选择,因为:

      1. 升级是有原因的(为了提供更好的身份验证)。
      2. 您可能没有足够的权限进行此类更改。

      您可以使用mysql2 包代替mysql。它的大部分 API 与 mysqljs 兼容。 此外,它还具有承诺支持。

      像这样使用它: const mysql = require('mysql2/promise')(用于基于 promise 的方法)

      您可以在此处阅读有关mysql2 的更多信息:https://www.npmjs.com/package/mysql2

      【讨论】:

      • 我只用mysql2! const mysql = require('mysql2')。有用!非常感谢?
      • 老兄,我可能已经创建了prettyquery 来承诺无条件支持:o
      【解决方案5】:

      在MYSQL Workbench中执行以下查询

      ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

      root 作为您的用户 localhost 作为您的网址 和password 作为你的密码

      然后运行此查询以刷新权限:

      flush privileges;

      完成后尝试使用节点连接。

      如果这不起作用,请尝试不使用 @'localhost' 部分。

      【讨论】:

      • 这对我有用。之后别忘了flush privileges;
      • 它在没有@localhost 的情况下对我有用(我想这可能是因为它不适合 root 用户)
      • 如果你知道的话,用你的root密码替换'password'
      • 它可以工作......但是为什么它之前不工作以及为什么它在这个查询之后工作仍然是一个问题。
      • 嗨@GuilhermeMatuella 这是因为caching_sha2_password是在MySQL 8.0中引入的,但是Node.js版本还没有实现。
      【解决方案6】:

      对于 MySql 8,不要更改 root 用户的身份验证,而是创建一个具有所有权限的新 用户,并将身份验证方法从 cache_sha2_password 更改为 mysql_native_password。 详细步骤请查看 Ochuko Ekrresa 的documentation

      步骤总结:

      1. 以root身份登录mysql -u root -p
      2. 创建新用户CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
      3. 授予所有权限GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost';

      查看上述文档链接以获取有关授予特定权限的详细信息。

      1. 重新加载权限FLUSH PRIVILEGES;
      2. 退出 MySql quit; 并使用 mysql -u [newuser] -p; 再次登录
      3. 最后一步更改身份验证ALTER USER 'newuser'@'localhost' IDENTIFIED WITH mysql_native_password by 'password';

      附加信息: 对我来说,在更改 root 身份验证后,我遇到了身份验证问题并且无法登录。所以我重设了密码(Reset password doc)。

      【讨论】:

        【解决方案7】:
        UPDATE mysql.user SET authentication_string = PASSWORD('MY_NEW_PASSWORD')
        WHERE User = 'root' AND Host = 'localhost';
        FLUSH PRIVILEGES;
        

        这对我有用。

        【讨论】:

          【解决方案8】:

          我建议使用KnexjsMySQL2

          你可以使用caching_sha2_password auth 方法。

          使用 Knex 查询:

          const response = await knex.raw("SELECT * FROM USERS");
          

          如果您没有远程用户,请使用 CREATE 关键字而不是 ALTER 并将以下命令放在终端上。

          ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'yourpass';
          GRANT ALL ON *.* TO 'root'@'%';
          Flush privileges;
          
          ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourpass';
          GRANT ALL ON *.* TO 'root'@'localhost';
          Flush privileges;
          

          全部完成:)

          【讨论】:

            【解决方案9】:

            最简单的答案是:-

            1. 在节点中使用mysql2而不是mysql

            在节点中安装mysql2

            1. npm install mysql2

            不要降级你的 mysql 数据库。

            你可以走了。 编码愉快!

            【讨论】:

              【解决方案10】:

              确保您用来访问您的数据库的用户具有这样做的权限。
              GRANT ALL PRIVILEGES ON * . * TO 'user'@'localhost';
              其中第一个星可以替换为数据库名称,第二个星指定表。确保在之后刷新权限。

              【讨论】:

                【解决方案11】:

                如果您有权创建新用户权限,则可以正常连接 node.js,这对我有用

                【讨论】:

                  【解决方案12】:

                  我遇到这个错误好几个小时了,终于明白了。正如 Zchary 所说,请非常仔细地检查您传入的数据库名称是否正确。

                  实际上,就我而言,情况更糟:我将我的createConnection() 参数全部作为undefined 传递,因为我是从process.env 获取它们的。或者我是这么想的!然后我意识到我的调试和测试 npm 脚本可以正常运行,但无法正常运行。嗯……

                  所以重点是——即使用户名、密码、数据库和主机字段都是undefined,MySQL 似乎也会抛出这个错误,这有点误导..

                  无论如何,故事的士气 - 首先检查愚蠢和看似不可能的事情!

                  【讨论】:

                    【解决方案13】:

                    我也遇到了这个问题,上面提到的所有 MySQL 重新配置仍然出现错误。结果是我拼错了数据库名称

                    所以请确保您使用正确的数据库名称进行连接,尤其是这种情况。

                    【讨论】:

                      【解决方案14】:

                      对于在 Windows 10 mysql 上安装的现有 mysql 8.0,

                      1. 启动安装程序,

                      2. 点击QuickAction下的“Reconfigure”(MySQL Server左侧),然后

                      3. 点击next进入接下来的2个屏幕直到到达

                      4. 在“Authentication Method”处,选择“Use Legacy Authentication Method (Retain MySQL 5.x compatible”

                      5. 一直点击直到安装完成

                      【讨论】:

                      • 我们不是想拥有最新的,因为它更安全吗?
                      • 当然我们应该这样做,但有时它需要重写客户/老板/规范坚持不受影响的部分代码,或者我们只是懒惰不想修补当它与项目相切或在其他人的范围内时的身份验证代码......
                      【解决方案15】:

                      您可以跳过 ORM、构建器等,并使用 sqlersqler-mdb 简化 DB/SQL 管理。

                      -- create this file at: db/mdb/read.table.rows.sql
                      SELECT TST.ID AS "id", TST.NAME AS "name", NULL AS "report",
                      TST.CREATED_AT AS "created", TST.UPDATED_AT AS "updated"
                      FROM TEST TST
                      WHERE UPPER(TST.NAME) LIKE CONCAT(CONCAT('%', UPPER(:name)), '%') 
                      
                      const conf = {
                        "univ": {
                          "db": {
                            "mdb": {
                              "host": "localhost",
                              "username":"admin",
                              "password": "mysqlpassword"
                            }
                          }
                        },
                        "db": {
                          "dialects": {
                            "mdb": "sqler-mdb"
                          },
                          "connections": [
                            {
                              "id": "mdb",
                              "name": "mdb",
                              "dir": "db/mdb",
                              "service": "MySQL",
                              "dialect": "mdb",
                              "pool": {},
                              "driverOptions": {
                                "connection": {
                                  "multipleStatements": true
                                }
                              }
                            }
                          ]
                        }
                      };
                      
                      // create/initialize manager
                      const manager = new Manager(conf);
                      await manager.init();
                      
                      // .sql file path is path to db function
                      const result = await manager.db.mdb.read.table.rows({
                        binds: {
                          name: 'Some Name'
                        }
                      });
                      
                      console.log('Result:', result);
                      
                      // after we're done using the manager we should close it
                      process.on('SIGINT', async function sigintDB() {
                        await manager.close();
                        console.log('Manager has been closed');
                      });
                      

                      【讨论】:

                        【解决方案16】:

                        除了以上答案; 执行以下命令后

                        ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'
                        

                        如果你得到一个错误:

                        [ERROR] Column count of mysql.user is wrong. Expected 42, found 44. The table is probably corrupted
                        

                        然后以管理员身份在 cmd 中尝试;在cmd中设置MySQL服务器bin文件夹的路径

                        set path=%PATH%;D:\xampp\mysql\bin;
                        

                        然后运行命令:

                        mysql_upgrade --force -uroot -p
                        

                        这应该会更新服务器和系统表。

                        那么您应该能够在 Workbench 的 Query 中成功运行以下命令:

                         ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'    
                        

                        然后记得执行以下命令:

                        flush privileges;
                        

                        完成所有这些步骤后应该能够成功连接到您的 MySQL 数据库。 希望这会有所帮助...

                        【讨论】:

                          【解决方案17】:

                          如果您使用的是 docker,它对我有用!

                          docker-compose.yml 中添加以下行:

                          mysql:
                             ...    
                             command: --default-authentication-plugin=mysql_native_password
                             restart: always
                          

                          之后,down 容器和 up 再次。

                          【讨论】:

                            【解决方案18】:

                            在尝试了很多事情之后才发现这一点。最终为我做的是将require('dotenv').config() 添加到我的.sequelizerc 文件中。显然 sequelize-cli 不读取环境变量。

                            【讨论】:

                              【解决方案19】:

                              如果您遇到此错误但仍想使用 MySQL 版本 8。您可以通过在使用 Docker 创建数据库时告诉 MySQL 服务器使用旧版身份验证插件来实现此目的。

                              因此,您的 compose 文件将如下所示:

                              # Use root/example as user/password credentials
                              
                              version: '3.1'
                              
                              services:
                              
                                db:
                                  image: mysql:8.0.15
                                  command: --default-authentication-plugin=mysql_native_password
                                  restart: always
                                  environment:
                                     MYSQL_ROOT_PASSWORD: 'pass'
                                     MYSQL_DATABASE: 'db'
                                     MYSQL_USER: 'user'
                                     MYSQL_PASSWORD: 'pass'
                                  ports:
                                    - 3318:3306
                                  # Change this to your local path
                                  volumes:
                                    - ~/Database/ORM_Test:/var/lib/mysql
                              

                              【讨论】:

                              • 我正在使用这个command,但在Node.js 中使用mysql 时仍然收到不支持的身份验证错误消息
                              • 完整的堆栈跟踪在这里:pastebin.com/SzayQzdhdocker-compose.ymlpastebin.com/7pUrWYDs 错误本身是:Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
                              • @JuhaUntinen 确保您删除了 Docker 容器(由 docker-compose 创建的容器)和卷(~/Database/ORM_Test),然后再次运行“docker-compose up”。否则将不会应用来自“命令”的更改。这对我有帮助。
                              • 该命令必须在创建用户之前在 docker-compose 中设置。如果您使用的是 MYSQL_USER 和 MYSQL_PASSWORD,则必须清除 /var/lib/mysql 并从头开始,以便在创建用户之前设置命令,或者回退到其他答案之一并更改已创建的用户跨度>
                              • @VitaliiIvanov 没错。这可以通过docker-compose down --volumes &amp;&amp; docker-compose up 来完成。
                              【解决方案20】:

                              对于 MySQL 8+,新的默认身份验证是 caching_sha2_password 而不是 mysql_native_password。原生 mysql 包尚不支持新的更安全的身份验证方法,但您应该考虑改用由 Oracle 官方支持和维护的包 @mysql/xdevapi

                              要安装新包,运行:

                              npm install @mysql/xdevapi --save --save-exact
                              

                              要连接到数据库并插入一些值:

                              const mysqlx = require('@mysql/xdevapi');
                              var myTable;
                              
                              mysqlx
                                  .getSession({
                                      user: 'root',
                                      password: '*****',
                                      host: 'localhost',
                                      port: 33060
                                  })
                                  .then(function (session) {
                              
                                  // Accessing an existing table
                                  myTable = session.getSchema('Database_Name').getTable('Table_Name');
                              
                                  // Insert SQL Table data
                                  return myTable
                                      .insert(['first_name', 'last_name'])
                                      .values(['John', 'Doe'])
                                      .execute()
                                  });
                              

                              官方包文档可以在这里找到: https://dev.mysql.com/doc/dev/connector-nodejs/8.0/

                              【讨论】:

                                【解决方案21】:

                                在 MySQL 8.0 中,caching_sha2_password 是默认身份验证 插件而不是mysql_native_password. ...

                                此问题中的大多数答案导致身份验证机制从caching_sha2_password 降级为mysql_native_password。从安全角度来看,这非常令人失望。

                                This 文档广泛讨论了caching_sha2_password,当然还有为什么它不应该是降级身份验证方法的首选。

                                因此,我相信 Aidin 的 answer 应该是公认的答案。不要降级身份验证方法,而是使用与服务器版本匹配的connector

                                【讨论】:

                                  【解决方案22】:

                                  如果 ALTER USER ... 命令行不适合您,并且如果您使用的是 Windows 10,请尝试按照以下步骤操作:

                                  1) 在 Windows 搜索栏中输入 MySQL

                                  2) 打开 MySQL Windows 安装程序 - 社区

                                  3) 寻找“MySQL 服务器”并点击重新配置

                                  4) 点击“下一步”,直到进入“验证方法”阶段

                                  5) 在“身份验证方法”阶段检查第二个选项“使用传统身份验证方法”

                                  6) 然后按照 Windows 安装程序给出的步骤,直到结束

                                  7) 完成后,从 Windows 搜索栏进入“服务”,点击“开始”MySql81。

                                  现在,再试一次,MySQL 和 Node.js 之间的连接应该可以正常工作了!

                                  【讨论】:

                                  • 这个解决方案解决了我的问题。我的代码很好,只是我的 Windows 10 机器上的身份验证是问题所在。
                                  【解决方案23】:

                                  检查您的 MySQL 用户的权限和用户名/密码。

                                  为了捕捉错误,使用重写的_delegateError 方法总是有用的。在您的情况下,这必须看起来像:

                                  var mysql = require('mysql');
                                  
                                  var con = mysql.createConnection({
                                    host: "localhost",
                                    user: "root",
                                    password: "password",
                                    insecureAuth : true
                                  });
                                  
                                  var _delegateError = con._protocol._delegateError;
                                  
                                  con._protocol._delegateError = function(err, sequence) {
                                      if (err.fatal)
                                          console.trace('MySQL fatal error: ' + err.message);
                                  
                                      return _delegateError.call(this, err, sequence);
                                  };
                                  
                                  con.connect(function(err) {
                                    if (err) throw err;
                                  
                                    console.log("Connected!");
                                  });
                                  

                                  这种结构将帮助您追踪致命错误。

                                  【讨论】:

                                    【解决方案24】:

                                    MySQL 8 的完整步骤

                                    连接到 MySQL

                                    $ mysql -u root -p
                                    Enter password: (enter your root password)
                                    

                                    重设密码

                                    (将your_new_password替换为您要使用的密码)

                                    mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_password';
                                    mysql> FLUSH PRIVILEGES;
                                    mysql> quit
                                    

                                    然后尝试使用节点连接

                                    【讨论】:

                                    • @sky 有关详细信息,请参见我上面的答案。
                                    • 我更喜欢这种直接的方法,而不是在令人困惑的 Mysql Workbench 中游来游去,想知道命令实际在哪里/是否在运行。
                                    【解决方案25】:

                                    我在服务器上有 MYSQL,在另一台服务器上有 nodejs 应用程序

                                    在 MYSQL Workbench 中执行以下查询

                                    ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password'

                                    【讨论】:

                                      【解决方案26】:

                                      虽然接受的答案是正确的,但我更愿意创建一个新用户,然后使用该用户访问数据库。

                                      create user nodeuser@localhost identified by 'nodeuser@1234';
                                      grant all privileges on node.* to nodeuser@localhost;
                                      ALTER USER 'nodeuser'@localhost IDENTIFIED WITH mysql_native_password BY 'nodeuser@1234';
                                      

                                      【讨论】:

                                      • 如果有人想走这条路,这里有一篇文章有​​一些解释:digitalocean.com/community/tutorials/…
                                      • Siddhant 会“更喜欢”,但我是“必须”这样做的。 IMO,这使得这个答案需要阅读!
                                      • 对我来说,给定的权限不足以创建数据库。我给了grant all privileges on *.* to nodeuser@localhost;
                                      • 我认为在这里使用授予权限对我来说效果很好。我可以建议某人使用这个答案。
                                      • “nodeuser@1234”到底应该是什么?新密码?为什么我们需要它?
                                      【解决方案27】:

                                      使用旧的mysql_native_password 工作:

                                      ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourRootPassword';
                                      -- or
                                      CREATE USER 'foo'@'%' IDENTIFIED WITH mysql_native_password BY 'bar';
                                      -- then
                                      FLUSH PRIVILEGES;
                                      

                                      这是因为caching_sha2_password是在MySQL 8.0中引入的,但是Node.js版本还没有实现。您可以查看this pull requestthis issue 了解更多信息。可能很快就会修复!

                                      【讨论】:

                                      • 添加@localhost 和只添加'root'有什么区别
                                      • 查询有效。但是节点仍然无法连接到 MySQL 服务器。任何想法?这是错误,{ "code": "ER_ACCESS_DENIED_ERROR", "errno": 1045, "sqlMessage": "Access denied for user 'root'@'localhost' (using password: YES)", "sqlState": "28000" , "致命": true }
                                      【解决方案28】:

                                      在 Mysql 最新的 docker 容器中

                                      ALTER USER root IDENTIFIED WITH mysql_native_password BY 'password';
                                      

                                      【讨论】:

                                      • 警告:这将使您的数据库安全性降低
                                      【解决方案29】:

                                      您可以在此处找到原始文档:https://dev.mysql.com/doc/dev/connector-nodejs/8.0/

                                      'use strict';
                                      
                                      const mysqlx = require('@mysql/xdevapi');
                                      
                                      const options = {
                                        host: 'localhost',
                                        port: 33060,
                                        password: '******',
                                        user: 'root',
                                        schema: 'yourconference'
                                      };
                                      
                                      mysqlx.getSession(options)
                                        .then(session => {
                                                console.log(session.inspect());
                                                 session.close();
                                        }).catch(err => {
                                          console.error(err.stack);
                                          process.exit(1);
                                        });
                                      

                                      【讨论】:

                                      • 看起来比较复杂,不过我觉得还是按照官方的指南吧! b
                                      【解决方案30】:

                                      我在使用 MySQL 时遇到了同样的问题,我通过使用 XAMPP 连接 MySQL 并在 Windows for MySQL(控制面板 - 管理工具 - 服务)和文件夹 db.js(负责数据库)我把密码设为空(这里你可以看到:)

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

                                      【讨论】:

                                      • 请不要添加您面临的问题作为对所面临问题的回答
                                      • 也不要使用root 连接到您的数据库。创建另一个用户,授予您需要的权限,而不是使用它!
                                      猜你喜欢
                                      • 1970-01-01
                                      • 2019-03-19
                                      • 2018-10-29
                                      • 2018-11-03
                                      • 2018-12-11
                                      • 2019-04-16
                                      相关资源
                                      最近更新 更多