ER_NOT_SUPPORTED_AUTH_MODE - MySQL服务器

Joã*_*eia 19 mysql node.js

我已经设置了一个MySQL数据库.当我尝试通过我的Node JS服务器访问它时,我收到错误

"ER_NOT_SUPPORTED_AUTH_MODE:客户端不支持服务器请求的身份验证协议;请考虑升级MariaDB客户端"

这很奇怪,因为我已经卸载了MariaDB并使用Homebrew安装了MySQL.

这是我的连接尝试:

var mysql = require('mysql');

var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : '********',
  database : 'vod_bill_database'
}); 
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢

Arc*_*dze 58

现在8.0版本是更改插件的方法:使用此示例:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'
Run Code Online (Sandbox Code Playgroud)

  • 这个答案不太有意义,因为它取自这篇文章的上下文:/sf/ask/3506520111/ - 按服务器。我建议只看它而不是这篇文章。 (7认同)

JΛY*_*ÐΞV 17

此问答线程中评分最高的答案在很大程度上是准确/有效的,但至少可以说是无组织的。然而,这里有一个解决方案;解决方案是在三个答案中找到的点点滴滴。为了提供一个单一帖子中存在的答案和解决方案,更易于阅读、解释、全面更有帮助和节省时间,我将尝试用清晰、简洁、有序的说明来回答问题涵盖了 Ubuntu 用户遇到的整个问题。此外,我将添加其他答案中未包含的必要信息,以了解正在解决的问题。就像这个问题不是 SQL 问题,它是一个 Ubuntu。使读者清楚持久性的问题是什么;“ROOT”用户在 Ubuntu 中没有密码。Ubuntu 用户使用 sudo 命令,并通过对几乎所有内容使用 sudo cmd 的许可来组织权限,也有例外,并且有一个 Ubuntu Root 用户选项,但现在在这里讨论这些事情无济于事。需要注意的重要事项如下:

  • Ubuntu 缺少“根密码”,这就是为什么遇到我们正在讨论的问题的每个人都运行 Ubuntu OS/SHELL 发行版的原因。我们不能给 Ubuntu SHELL 一个“ROOT PASSWORD”,但是,我们可以,而且我们将给我们的“MYSQL-COMMUNITY-SERVER”一个“ROOT PWD”。

首先你需要 NPM、NodeJS、MySql 和 NPM 的 MySql 驱动程序。如果您还没有它们,您甚至不应该阅读本文,因为您甚至无法 100% 知道您要解决的问题是否是这样的……

...如果您确实拥有列表中的所有内容,并且正在运行 Ubuntu 发行版,并且收到如下所示的错误身份验证消息和连接错误消息

  • 错误: (28000): 用户 'ajc'@'localhost' 访问被拒绝
  • ERROR: ERROR_NOT_SUPPORTED_AUTH_MODE: 客户端不支持服务器请求的认证协议;考虑升级 MySQL 客户端
  • '客户端不支持服务器请求的认证协议;考虑升级 MySQL 客户端

那么您可能来对地方了。

  • 要解决问题,首先创建一个空的“dot JS”文件进行测试,将其命名为“sqltest.js”或任何您喜欢的名称。

  • 将下面的代码添加到其中。

  • 在名为“createConnection”的方法中,有一个 JSON OBJ 参数,用于保存与 MySql 数据库服务器建立有效连接的凭据值。用户必须等于“root”,并且数据库必须存在。还要在以后的测试中向数据库添加一个测试表,其中包含一些 BS 数据。”

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.');
  });


Run Code Online (Sandbox Code Playgroud)

现在打开一个终端窗口,并进行典型的更新和升级,这很重要,这就是为什么每个人都要求你这样做。

~$: sudo apt update
~$: sudo apt upgrade
Run Code Online (Sandbox Code Playgroud)

let connection = mysql.createConnection({ host : 'localhost', user : 'root', password : '********', database : 'DB_App_00', });

现在输入以下cmd

~$: sudo mysql -u root

Run Code Online (Sandbox Code Playgroud)
  • 它应该提示你输入你的 Ubuntu 密码,输入它并 [ENTER]。

现在这是可以被认为是药物和/或解决问题的方法的步骤。您的终端应该是打开的,并且您应该在 MYSQL Server 中,在用户“root”下。终端应该让光标在空白的 mysql 命令行上闪烁。在 CMDL 中复制并粘贴:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'ChoosePassword';

mysql> FLUSH PRIVILEGES;

Run Code Online (Sandbox Code Playgroud)
  • 下一部分很明显,将“选择密码”更改为您将记住的密码,同时将密码保留在单引号内。绝对不要更改其他内容,按 [ENTER]

  • 如果您正确地遵循了这些步骤,您现在就拥有了一个带有自己密码的 MySQL 'ROOT USER'。通过在 Ubuntu CMDL 中复制并粘贴以下内容来测试它:

 ~$: mysql -u root -p 
Run Code Online (Sandbox Code Playgroud)
  • 它会提示您输入新密码,输入它并 [ENTER]

……你应该进去了,现在退出。

mysql>exit
Run Code Online (Sandbox Code Playgroud)
  • 返回到您的“testsql.js”文件,将用户凭据更改为 root,将密码更改为密码,将有效数据库更改为主机,并将主机更改为 localhost,除非您对不同的主机名有独特的需求。

let connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : '********',
    database : 'DB_App_00',
});


Run Code Online (Sandbox Code Playgroud)

现在使用 node 运行 node 测试文件

~$: node testsql.js
Run Code Online (Sandbox Code Playgroud)

如果它没有说连接你做错了什么,但如果一切顺利,你应该连接。在我开始工作之前需要付出一些努力,但是这个答案应该可以为您节省一些时间来阅读所有其他一半的书面答案。


Vin*_*eri 9

在此输入图像描述

重新配置身份验证方法,您可以选择5.1的传统类型密码支持

错误原因

*您安装了最新的Mysql 8.0,它具有不同的身份验证方法.降级5.6或5.1是简单的解决方案


小智 9

您可以更改现有用户以使用 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;
Run Code Online (Sandbox Code Playgroud)

用您的新用户名替换 new_user,并设置您的密码。

现在您可以使用 mysql 包从节点访问 mysql,

 npm install mysql
Run Code Online (Sandbox Code Playgroud)

建议为此包使用池连接。


Joã*_*eia 7

我认为某些 MySQL 版本的建立连接的身份验证有点混乱。我所要做的就是将这一行添加"insecureAuth" : trueCreateConnection(...)凭据中。

var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : '********',
  database : 'vod_bill_database',
  insecureAuth : true
}); 
Run Code Online (Sandbox Code Playgroud)

现在错误消失了,客户端连接成功。

  • 不适用于 ubuntu 上的 mysql 8.0,因为它(在此评论的日期)仍然不受 mysql.js 支持。 (11认同)
  • 请勿使用此配置!!!此方法是为了维护需要旧的且非常不安全的身份验证方法的版本的兼容性。在此 hack 可能有效也可能无效的情况下,这是一种“不安全”的身份验证方法,应尽可能避免。考虑到名称,这应该是显而易见的。如果您想亲自查看,这里是 API 的链接和连接选项。https://www.npmjs.com/package/mysql#connection-options (6认同)

小智 5

第一次运行此代码 ->

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Run Code Online (Sandbox Code Playgroud)

第二名

flush privileges;
Run Code Online (Sandbox Code Playgroud)


Kun*_*ngi 5

您可以更改您使用的包,使用 mysql2 而不是 mysql 我有同样的问题,mysql2 为我工作

npm 我 mysql2

  • 完全完美的解决方案 - 谢谢 (4认同)
  • 这是正确的答案!更改数据库服务器是一种解决方法,而不是解决方案。MySQL 8 使用新的身份验证协议。mysql2 支持新协议,但 mysqljs/mysql 不支持。 (4认同)
  • 这就像魔术一样!谢谢刚刚安装了mysql2,只改变了这个`import mysql=require("mysql2")` (3认同)
  • 如此被低估的答案,就像一个魅力 (2认同)
  • 这对我有用,谢谢!正确答案! (2认同)