由于某种原因,我无法与服务器建立简单的连接。我用默认设置安装了最新的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.htmlhttps网址:github.com/mysqljs/mysql/issues/1507
但我仍然不知道如何解决我的问题。任何帮助都将不胜感激:d
24条答案
按热度按时间a7qyws3x1#
降级可能不是一个好的选择,因为:
它的升级是有原因的(为了提供更好的身份验证)。
您可能没有足够的权限进行此类更改。
你可以用
mysql2
Package 代替mysql
. 它的api主要与mysqljs兼容。此外,它还承诺提供支持。像这样使用:
const mysql = require('mysql2/promise')
(用于基于承诺的方法)你可以阅读更多关于
mysql2
在这里:https://www.npmjs.com/package/mysql2希望有帮助。:)
qnzebej02#
我们先弄清楚发生了什么事。
mysql 8支持可插入的身份验证方法。默认情况下,其中一个
caching_sha2_password
是用而不是我们的好老mysql_native_password
(来源)。很明显,使用加密算法进行多次握手比使用24年的普通密码传递更安全!现在,问题是
mysqljs
在节点中(与您一起安装的软件包npm i mysql
并在节点代码中使用)还不支持MySQL8这种新的默认身份验证方法。问题在于: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
在这个问题上工作得很好--我稍后会自己测试它。您当前的选项
选项1)降级“mysql”以使用旧的“原生密码”进行身份验证
这是每个人在这里建议的(例如上面的顶部答案)。你只要进入
mysql
然后运行一个查询root
用旧的可以吗native_password
授权方法:好的是,生活会很简单,你仍然可以使用像sequel pro这样的老工具,而没有任何问题。但问题是,你没有利用一个更安全(和酷,阅读下文)的东西提供给你。
选项2)用mysql connecter x devapi替换“node”包
mysql x devapi for node是node的mysqljs包的替代品,由http://dev.mysql.com official 伙计们。
它就像一个护身符
caching_sha2_password
身份验证(一定要用左舷33060
用于x协议通信。)糟糕的是,你离开了我们的老朋友
mysql
每个人都如此习惯和依赖的软件包。好在,你的应用程序现在更安全了,你可以利用我们的老朋友没有提供的大量新东西!只要看看x devapi的教程,你就会发现它有很多新的性感功能,可以派上用场。你只需要付出学习曲线的代价,任何技术升级都会带来学习曲线。:)
不幸的是,这个xdevapi包还没有类型定义(typescript可以理解),所以如果您使用typescript,您将遇到问题。我试着用
dts-gen
以及dtsmake
,但没有成功。所以记住这一点。干杯!
kjthegm63#
您可以在此处找到原始文档:https://dev.mysql.com/doc/dev/connector-nodejs/8.0/
nkoocmlb4#
如果您有权创建一个新的用户权限,那么就这样做,以正常连接node.js,这对我来说是有效的
llmtgqce5#
您可以跳过orm、构建器等,并使用
sqler
以及sqler-mdb
.ndasle7k6#
虽然接受的答案是正确的,但我更喜欢创建一个新用户,然后使用该用户访问数据库。
tv6aics17#
确保您正在使用的用户
kyvafyod8#
在mysql 8.0中,
caching_sha2_password
是默认的身份验证插件,而不是mysql_native_password. ...
这个问题的大多数答案都会导致身份验证机制从caching_sha2_password
至mysql_native_password
. 从安全的Angular 来看,这是相当令人失望的。本文件广泛讨论
caching_sha2_password
当然,为什么不应该首先选择降级身份验证方法。因此,我相信艾丁的答案应该是公认的答案。与其降级身份验证方法,不如使用与服务器版本匹配的连接器。
bbmckpt79#
我在服务器上有mysql,在另一台服务器上有nodejs应用程序
在mysql工作台中执行以下查询
将用户“root”@“%”标识为mysql\u native\u password,修改为“password”
gcmastyq10#
除上述答案外;执行以下命令后
如果出现以下错误:
然后以admin的身份输入cmd;在cmd中设置mysql server bin文件夹的路径
然后运行命令:
这将更新服务器和系统表。
然后您应该能够在工作台的查询中成功运行以下命令:
然后记住执行以下命令:
完成所有这些步骤后,您应该能够成功地连接到mysql数据库。希望这有帮助。。。
flvlnr4411#
mysql 8的完整步骤
连接到mysql
重置密码
(替换
your_new_password
使用您要使用的密码)然后尝试使用节点连接
mqxuamgl12#
对于windows 10 mysql上现有的mysql 8.0安装,
启动安装程序,
单击quickaction下的“重新配置”(mysql服务器左侧),然后
单击next(下一步)在接下来的2个屏幕中前进,直到到达
在“authentication method”中,选择“use legacy authentication method(retain mysql 5.x compatibility)”选项
一直单击直到安装完成
mspsb9vt13#
如果遇到此错误但仍要使用
MySQL
版本8。您可以通过告诉mysql服务器在使用创建数据库时使用遗留身份验证插件来实现这一点Docker
.所以,你的
compose
文件将如下所示:5t7ly7z514#
使用旧的
mysql_native_password
作品:这是因为
caching_sha2_password
mysql 8.0中引入了node.js版本,但尚未实现。有关更多信息,请参见此pull请求和此问题。可能很快就会有解决办法了!yv5phkfx15#
我犯了这个错误好几个小时,最后才弄清楚原因。正如zchary所说,请非常仔细地检查是否传入了正确的数据库名称。
事实上,在我的情况下,更糟的是:我在传递我所有的信息
createConnection()
参数为undefined
因为我是从process.env
. 或者我是这么想的!然后我意识到我的调试和测试npm脚本工作了,但是正常运行失败了。隐马尔可夫模型。。。所以关键是-mysql似乎抛出这个错误,即使用户名、密码、数据库和主机字段都是
undefined
,这有点误导。。无论如何,故事的士气-检查愚蠢和似乎不太可能的事情第一!