由于某种原因,我无法建立到服务器的简单连接。我安装了最新的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

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


当前回答

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

因此,请确保您使用正确的数据库名称进行连接,特别是在这种情况下。

其他回答

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

启动安装程序, 单击“快速操作”下的“重新配置”(MySQL服务器左侧),然后 点击下一步前进通过接下来的2个屏幕,直到到达 在“认证方法”中,选择“使用遗留的认证方法(保留MySQL)”。x兼容性” 继续单击,直到安装完成

总结

If you just want to get rid of the error, at the cost of risking the security of the project (e.g. it's just a personal project or dev environment), go with @Pras's answer -- ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password' and then flush privileges If you want to have a fix for it, without knowing why, just install and use mysql2 (instead of mysql) and use it -- npm i mysql2, and mysql = require('mysql2');. If you are a curious developer who is always eager to learn, keep reading ... :)


这是怎么呢

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

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

现在,问题是mysqljs在Node(你安装的包与npm i mysql和使用它在你的节点代码)不支持这个新的默认认证方法的mysql 8,还。问题在这里:https://github.com/mysqljs/mysql/issues/1507, 3年后,截至2019年7月,仍然开放。

2019年6月更新:mysqljs中现在有一个新的PR来修复这个问题!

2020年2月更新:显然,它计划在mysqljs的第3版中出现。

2020年7月更新:显然它还没有(至少到2020年4月),但据称node-mysql2支持身份验证切换请求。如果node-mysql2在这个问题上工作正常,请在下面评论——我稍后会自己测试。

2021年4月更新:似乎这个问题仍然存在,就在3天前,有人创建了一个分叉并将其放在那里——但在mysql.js包中还没有正式发布。此外,根据下面的评论,似乎mysql2包工作良好,并正确支持身份验证开关。


你目前的选择

选项1)[不推荐]降级“MySQL”验证使用好旧的“mysql_native_password”

这就是这里每个人的建议(例如上面的答案)。你只需进入mysql,运行一个查询,说root是好的,使用旧的mysql_native_password方法进行身份验证:

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

好在,生活将变得简单,你仍然可以毫无问题地使用Sequel Pro等优秀的老工具。但问题是,你没有利用更安全(也更酷,请阅读下文)的东西。

选项2)[Meh…用MySQL connect X DevAPI替换“Node”包

MySQL X DevAPI for Node是Node的Mysqljs包的替代品,由http://dev.mysql.com官方人员提供。

它支持caching_sha2_password身份验证。(只要确保使用端口33060进行X协议通信即可。)

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

好消息是,你的应用现在更安全了,你可以利用我们的老朋友没有提供的大量新东西!只要看看X DevAPI的教程,你就会发现它有大量的性感新功能可以派上用场。你只需要为学习曲线付出代价,这是任何技术升级都必然会出现的。:)

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

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

如上所述,mysql包(NPM包链接)仍然存在此问题(截至2021年4月)。但是mysql2包(NPM包链接)不是。因此,下面的答案可能只需要一行代码!

npm un mysql && npm i mysql2

请注意,mysql2是流行的mysql的分支,但它的受欢迎程度(2020年4月mysql2每周下载620K次)已经接近原始包(2021年4月mysql每周下载720K次),使得转换似乎是合理的!

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

然后尝试使用node连接

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

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

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

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

你可以在这里阅读更多关于mysql2的内容:https://www.npmjs.com/package/mysql2

确保您用来访问数据库的用户具有这样做的权限。 授予*上的所有特权。* TO 'user'@'localhost'; 其中第一个星号可以替换为数据库名称,第二个星号指定表。请确保之后刷新特权。