ER_NOT_SUPPORTED_AUTH_MODE-MySQL 服务器
- 2024-10-25 08:42:00
- admin 原创
- 54
问题描述:
连接Node.js Server
失败MySQL-Database
我曾在“Node.js 服务器”上安装了MariaDB,但后来决定改用 SQL 数据库。我卸载并彻底删除了“MariaDB”,之后,我继续安装“社区版”的“MySQL 数据库”。在完成整个 “MySQL 安装过程” 后,我多次尝试通过 JavaScript 文档连接数据库,该文档实现了 JS DB 连接的实际代码片段 — —我的 DB 连接文档发布为下面的代码片段— — 如下面的代码片段所示*。令人失望的是,每次尝试时 JS/SQL 连接都会失败。
这是我收到的连接失败错误消息:
"ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication
protocol requested by server. Consider upgrading MariaDB client."
我正在使用的 JS/SQL 连接代码片段:
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '********',
database : 'foobarDb'
});
解决方案 1:
对于 MySQL v8.0,请使用以下命令:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'
您应该root
用用户名和password
我们要分配的密码替换。
完成后请FLUSH PRIVILEGES;
按顺序激活它。
解决方案 2:
您可以使用包mysql2
代替mysql
。我遇到了同样的问题,使用mysql2
对我有用。
您可以使用以下方式安装此包npm i mysql2
解决方案 3:
您需要Quick Action Settings
点击“重新配置链接”来重新配置,如下面的屏幕截图所示。从那里,选择“旧密码”v5.1
。
错误原因:
您安装了最新的“MySQL版本”,v8.0
最新版本具有不同的加密插件,用于在登录时对用户进行身份验证。5.6 和 5.1 恢复为以前的加密算法。请注意,5.6
Oracle5.1
报告了几个安全漏洞。
解决方案 4:
此问答线程中评分最高的答案大部分都有效,但它们毫无条理,至少可以这么说。这里有一个解决方案,但是,该解决方案是其他三个答案中的零碎部分。为了提供一个单一解决方案、更有帮助且节省时间的答案,我将尝试以清晰、简洁和有序的方式自己编写答案。我将介绍Ubuntu用户遇到的所有问题,此外,我将添加有用的信息(其他任何答案中都没有包含),这将有助于读者了解他们一直存在的问题。
首先:这个问题不是 SQL 问题,而是 Ubuntu 问题
对您来说持续存在的问题与以下事实有关(大多数软件开发人员/IT 专业人员可能都已经意识到这一事实),即用户'ROOT'
在 Ubuntu 中没有密码,任何有$ sudo
权限的人都可以访问该密码。为了向遇到此问题并且可能不熟悉我抛出的一些语义的任何人提供清晰度;Ubuntu 用户使用命令sudo -i
注册为Root-user,而现有的其他每个 Linux 发行版都使用带有密码的用户 ID。事实上,除了数据库管理之外,我不记得曾经需要成为 ROOT 用户来执行任何其他操作,而且只在我第一次将数据库安装到服务器时才需要,尽管与一些 IT 专业人员相比,我的经验可能非常有限。我的观点是,通常使用sudo
用于所有工作,但在这种情况下它是有问题的,因此需要注意的重要事项如下:
问题:
Ubuntu 缺少“根密码”,这就是为什么遇到我们正在讨论的问题的每个人都运行 Ubuntu OS/SHELL 的发行版。除非我们重写 Ubuntu 内核以及操作系统中的几乎所有其他内容,否则我们无法为 Ubuntu SHELL 提供“根密码”。
解决方案:
我们可能无法为 Ubuntu SHELL 提供 root 密码,但我们可以并且将会为MySQL提供'ROOT PASSWORD'
。
要执行解决方案,您需要具备以下条件:
Node.js v12+
NPM(可能需要 v5+,但不要引用我的话)
MySQL v8.0+(显然)
MySQL 驱动程序(来自 npm)
确认:
如果您还没有列出清单上的所有内容,那么您真的不能说这是您要处理的问题。
如果你确实拥有清单上的所有东西
并且您正在运行 Ubuntu 发行版,那么您应该会收到一条错误消息,该消息可能看起来像我在修复此问题时收到的错误消息。
我的错误信息如下:
ERROR: (28000): Access denied for user 'ajc'@'localhost'
ERROR: ERROR_NOT_SUPPORTED_AUTH_MODE: Client does not support
authentication protocol requested by server; consider upgrading
MySQL client
'Client does not support authentication protocol requested by server; consider upgrading MySQL client
如果您仍在阅读,那么您很可能来到了正确的地方。
要开始修复该问题,请创建一个空的Node.js项目,并使用 NPM 将 MySQL 驱动程序作为依赖项安装到该项目(您应该知道如何执行此操作,因为您必须这样做才能解决此问题)。添加一个 JavaScript
.js
文件。调用该文件,sqltest.js
或类似的东西。将以下代码添加到您刚刚创建的文件中。
let mysql = require('mysql');
let connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '********',
database : 'DB_App_00',
});
connection.connect(function(err) {
if (err) {
return console.error('error: ' + err.message);
}
console.log('Connected to the MySQL server.');
});
在名为“createConnection”的方法中有一个 JSON OBJ 参数,其中包含与MySQL数据库服务器建立有效连接的凭证值。用户必须等于“root”,并且数据库必须存在。此外,为了以后的测试,请向数据库添加一个测试表,其中包含一些 BS 数据。”
现在打开一个终端窗口,进行常规更新和升级,这很重要,这就是为什么每个教程都要求您这样做。
~$: sudo apt update
~$: sudo apt upgrade
升级完成后,在终端中输入以下命令:
~$: sudo mysql -u root
它会提示您输入 Ubuntu 密码,输入后按 [ENTER]。
下一步至关重要:
现在,这一步可以被视为问题的良药和/或解决办法。您的终端应该已打开,并且您应该位于 MYSQL 服务器内部,以用户“root”身份运行。终端应该有一个光标在空白的 mysql 命令行处闪烁。在 CMDL 中复制并粘贴以下内容:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'ChoosePassword';
mysql> FLUSH PRIVILEGES;
接下来的部分很明显,将“ChoosePassword”更改为您能记住的密码,同时将密码放在单引号内。其他什么都不要改,按 [ENTER]
如果您正确地遵循了这些步骤,那么您现在就拥有一个拥有自己密码的 MySQL“ROOT USER”。通过在 Ubuntu CMDL 中复制并粘贴以下内容来测试它:
~$: mysql -u root -p
它会提示您输入新密码,输入后按 [ENTER]
...您应该进来了,现在退出。
mysql>exit
返回到您的“testsql.js”文件,将用户凭据更改为 root,将密码更改为您的密码,将数据库更改为有效数据库,将主机更改为 localhost,除非您对不同的主机名有特殊需求。
let connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '********',
database : 'DB_App_00',
});
现在使用 node 运行节点测试文件
~$: node testsql.js
最后的想法:
如果没有显示已连接,则表示您做错了什么,但如果一切顺利,则应该可以连接。我花了一些功夫才让它工作,但这个答案应该可以为您节省一些时间,让您不必阅读其他半写半写的答案。
解决方案 5:
您可以更改现有用户以使用 mysql_native_password,或者创建新用户,
CREATE USER 'new_user'@'%' IDENTIFIED WITH mysql_native_password BY '***';
GRANT USAGE ON *.* TO 'new_user'@'%';
ALTER USER 'new_user'@'%' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
GRANT ALL PRIVILEGES ON `new_user`.* TO 'new_user'@'%';
FLUSH PRIVILEGES;
用您的新用户名替换 new_user,并设置您的密码。
现在你可以使用 mysql 包从 node 访问 mysql,
npm install mysql
建议对此包使用池连接。
解决方案 6:
我觉得有些 MySQL 版本的连接建立身份验证有点混乱。我所要做的就是在凭证"insecureAuth" : true
中添加这一行CreateConnection(...)
。
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '********',
database : 'vod_bill_database',
insecureAuth : true
});
错误现已消失,客户端已成功连接。
解决方案 7:
第一次运行此代码 ->
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
第二
flush privileges;
解决方案 8:
尝试旧版本的 mysql,例如 5.6.40,它默认使用 SHA256_password 身份验证,而新版本 8.0. 默认使用更安全的 sha2_password 身份验证并抛出此身份验证协议错误。MYSQL
安装程序 5.6.40
解决方案 9:
黄色哟兄弟!
// mysql.ts
const pool = mysql.createPool({
connectionLimit: 10,
host: "localhost",
user: "root",
password: "password",
database: "rest-resume-api",
});
然后我有一个docker-compose文件,例如
# docker-compose.yml
version: '3.3'
services:
db:
image: mysql
restart: always
command: --default-authentication-plugin=mysql_native_password
environment:
MYSQL_DATABASE: 'rest-resume-api'
MYSQL_USER: 'root'
MYSQL_ROOT_PASSWORD: 'password'
ports:
- '3306:3306'
expose:
- '3306'
volumes:
- my-db:/var/lib/mysql2
volumes:
my-db:
解决方案 10:
你能做到
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password'
FLUSH PRIVILEGES;
检查mysql root用户是否被识别
select user,host,plugin from user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| root | % | mysql_native_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
解决方案 11:
如果上述用户的密码类型中有phpMyAdmin ,请选择本机 mysql 身份验证
它对我有用
解决方案 12:
我通过卸载以前的mysql包npm uninstall mysql
然后使用安装mysql2解决了该问题npm install mysql2
。这对我来说非常有效。
解决方案 13:
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '********',
database : 'vod_bill_database',
port : 3308
});
我遇到了同样的错误,因为我将 phpmyadmin 中的端口从 3306 更改为 3308,因此在这里我也必须写入端口:3308,然后它就开始工作了。
解决方案 14:
为了解决此错误,请使用以下代码:
var connectionString = 'mysql://*root:*password@*localhost/*database?charset=utf8_general_ci&timezone=-0700';
var connection= mysql.createConnection(connectionString);
但请确保根据您的设置更改了 connectionString 中的 * 标记。
解决方案 15:
只需在 MySQL 上创建一个新用户
CREATE USER 'foo'@'localhost' IDENTIFIED WITH mysql_native_password BY 'bar';
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件