我是node.js和MySQL初学者,我刚开始设置并尝试一些基本代码.但是,由于某种原因,我甚至无法与服务器建立简单的连接.我使用默认设置安装最新的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!");
});
Run Code Online (Sandbox Code Playgroud)
以下是命令提示符中发现的错误:
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)
Run Code Online (Sandbox Code Playgroud)
我已经阅读了一些内容,例如:https : //dev.mysql.com/doc/refman/5.5/en/old-client.html https://github.com/mysqljs/mysql/issues/1507
但我仍然不确定如何解决我的问题.任何帮助将不胜感激:D
小智 430
在MYSQL Workbench中执行以下查询
ALTER USER'root'@'localhost'用mysql_native_password识别BY'密码'
在执行此操作后尝试使用节点进行连接
upu*_*ing 62
使用旧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;
Run Code Online (Sandbox Code Playgroud)
这是因为caching_sha2_password在MySQL 8.0中引入,但Node.js版本尚未实现.您可以查看此拉取请求和此问题以获取更多信息.可能很快就会出现修复!
Aid*_*din 34
首先让我们弄清楚发生了什么。
MySQL 8支持可插拔身份验证方法。默认情况下,将使用其中一个命名的名称caching_sha2_password,而不是我们的旧版本mysql_native_password(source)。很明显,使用加密算法并多次握手比使用已有24年的普通口令传递更为安全!
现在,问题出mysqljs在Node(用于安装npm i mysql和在Node代码中使用的软件包)尚不支持MySQL 8的这种新的默认身份验证方法。问题在这里:https : //github.com/mysqljs/mysql/issues/1507并在3年后的2019年7月仍然开放。 (2019年6月更新:mysqljs中有一个新的PR现在可以修复这个!)
这就是每个人的建议(例如,上方的最佳答案)。您只需进入mysql并运行root使用旧native_password方法进行身份验证就可以的查询:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password ...
Run Code Online (Sandbox Code Playgroud)
好消息是,生活将会变得很简单,您仍然可以使用Sequel Pro这样的旧工具而不会出现任何问题。但是问题是,您没有利用向您提供的更安全(并且很酷,请参阅下文)的东西。
适用于Node的MySQL X DevAPI是由http://dev.mysql.com官方提供的Node的Mysqljs软件包的替代品。
它像支持caching_sha2_password身份验证的超级按钮一样工作。(只需确保将端口33060用于X协议通信即可。)
不好的是,您已经离开了旧的mysql程序包,每个人都习惯并依赖它。
好消息是,您的应用现在更安全了,您可以利用我们的好朋友没有提供的大量新功能!只需查看X DevAPI教程,您就会发现它具有大量可以方便使用的新性感功能。您只需要付出学习曲线的代价即可,任何技术升级都可能附带该学习曲线。:)
PS。不幸的是,这个XDevAPI包还没有类型定义(TypeScript可以理解),因此,如果您使用的是Typescript,则会遇到问题。我尝试使用dts-gen和生成.d.ts dtsmake,但未成功。所以记住这一点。
干杯!
小智 17
如果 ALTER USER ... 命令行对您不起作用,并且您使用的是 Windows 10,请尝试按照以下步骤操作:
1)在windows搜索栏中输入MySQL
2) 打开 MySQL Windows 安装程序 - 社区
4) 点击“下一步”,直到到达“身份验证方法”阶段
5)在“身份验证方法”阶段,选中第二个选项“使用传统身份验证方法”

6)然后按照Windows安装程序给出的步骤直到结束
7) 完成后,从 Windows 搜索栏进入“服务”,单击“启动”MySql81”。
现在,再试一次,MySQL 和 Node.js 之间的连接应该可以工作了!
Alo*_*lok 16
最干净的解决方案是执行以下命令,这个问题就会消失:
npm uninstall mysql
npm install mysql2
Run Code Online (Sandbox Code Playgroud)
然后在您的代码中正常使用它:
var mysql = require('mysql2');
var con = mysql.createConnection({
host: "localhost",
user: "root",
password: "password"
});
con.connect(function(err) {
if (err) throw err;
console.log("Connected!");
});
Run Code Online (Sandbox Code Playgroud)
我的系统中没有任何 MySQL 客户端,但我docker container有一个映像,这给了我这个问题。只需安装即可mysql2解决问题。
您也可以在这里找到解决方案,在官方mysqlnpm 包问题的答案中提到。一切顺利。
Sid*_*ant 14
尽管接受的答案是正确的,但我还是希望创建一个新用户,然后使用该用户访问数据库。
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';
Run Code Online (Sandbox Code Playgroud)
jos*_*ell 13
$ mysql -u root -p
Enter password: (enter your root password)
Run Code Online (Sandbox Code Playgroud)
(替换your_new_password为您要使用的密码)
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_password';
mysql> FLUSH PRIVILEGES;
mysql> quit
Run Code Online (Sandbox Code Playgroud)
然后尝试使用节点连接
降级可能不是一个好的选择,因为:
您可以使用mysql2包代替mysql. 它的大部分 API 与 mysqljs 兼容。此外,它还承诺提供支持。
像这样使用它:(
const mysql = require('mysql2/promise')对于基于承诺的方法)
您可以在这里阅读更多信息mysql2: https: //www.npmjs.com/package/mysql2
对于 MySql 8,不要更改root用户的身份验证,而是创建一个具有所有权限的新用户,并将身份验证方法从 caching_sha2_password 更改为 mysql_native_password。请查看Ochuko Ekrresa 的文档以了解详细步骤。
步骤摘要:
mysql -u root -pCREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost';检查上述文档链接以获取有关授予特定权限的详细信息。
FLUSH PRIVILEGES;quit;并再次登录mysql -u [newuser] -p;ALTER USER 'newuser'@'localhost' IDENTIFIED WITH mysql_native_password by 'password';附加信息:对于我来说,更改 root 身份验证后,我遇到了身份验证问题并且无法登录。所以我重置了密码(重置密码文档)。
小智 7
在Mysql最新的docker容器中
ALTER USER root IDENTIFIED WITH mysql_native_password BY 'password';
Run Code Online (Sandbox Code Playgroud)
如果遇到此错误,但仍想使用MySQL版本8,则可以通过在使用Docker创建数据库时告诉MySQL服务器使用旧版身份验证插件来实现。
因此,您的撰写文件将如下所示:
# 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
Run Code Online (Sandbox Code Playgroud)
小智 6
如果您使用的是 docker,它对我有用!
在docker-compose.yml添加以下行:
mysql:
...
command: --default-authentication-plugin=mysql_native_password
restart: always
Run Code Online (Sandbox Code Playgroud)
之后,down容器up又一次。
您可以在此处找到原始文档: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);
});
Run Code Online (Sandbox Code Playgroud)
对于 Windows 10 mysql 上现有的 mysql 8.0 安装,
启动安装程序,
单击 QuickAction 下的“重新配置”(MySQL 服务器左侧),然后
单击“下一步”进入接下来的 2 个屏幕,直至到达
在“身份验证方法”中,选择“使用旧版身份验证方法(保留 MySQL 5.x 兼容性”)
一直点击直到安装完成
小智 5
简单我卸载 mysql并安装 mysql2来解决这个问题。
npm uninstall mysql && npm i mysql2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
181500 次 |
| 最近记录: |