MySQL 8.0 - клиент не поддерживает протокол аутентификации, запрашиваемый сервером; рассмотреть возможность обновления клиента MySQL
Я новичок 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!");
});
Ниже приведена ошибка в командной строке:
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
Но я все еще не уверен, как исправить мою проблему. Любая помощь будет оценена: D
Ответы
Ответ 1
Выполните следующий запрос в MYSQL Workbench
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'
Где root
качестве вашего пользователя localhost
качестве вашего URL и password
качестве вашего пароля
Попробуйте подключиться с помощью узла после этого
Ответ 2
Использование старого 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;
Это связано с тем, что caching_sha2_password
вводится в MySQL 8.0, но версия Node.js еще не реализована. Вы можете увидеть этот запрос на растяжение и эту проблему для получения дополнительной информации. Вероятно, исправить скоро!
Ответ 3
Хотя принятый ответ правильный, я бы предпочел создать нового пользователя и затем использовать его для доступа к базе данных.
create user [email protected] identified by '[email protected]';
grant all privileges on node.* to [email protected];
ALTER USER 'nodeuser'@localhost IDENTIFIED WITH mysql_native_password BY '[email protected]';
Ответ 4
Полные шаги для 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
Затем попробуйте подключиться с помощью узла
Ответ 5
В Mysql Последний докер-контейнер
ALTER USER root IDENTIFIED WITH mysql_native_password BY 'password';
Ответ 6
Давайте сначала проясним, что происходит.
MySQL 8 поддерживает подключаемые методы аутентификации. По умолчанию, один из них называется caching_sha2_password
а не наш старый добрый mysql_native_password
(источник). Должно быть очевидно, что использование криптоалгоритма с несколькими рукопожатиями является более безопасным, чем простая передача пароля, которая была там в течение 24 лет !
Теперь проблема в mysqljs
в Node (пакет, который вы устанавливаете с помощью npm я mysql
и используете его в своем коде Node), пока не поддерживает этот новый метод аутентификации по умолчанию в MySQL 8. Проблема находится здесь: https://github.com/mysqljs/mysql/issues/1507 и по-прежнему открыта, спустя 3 года, по состоянию на июль 2019 года. (ОБНОВЛЕНИЕ Июнь 2019 года: в mysqljs теперь есть новый PR, который нужно исправить этот!)
Ваши варианты
Вариант 1) Понизьте версию "MySQL" для аутентификации, используя старый добрый "native_password"
Это то, что все предлагают здесь (например, топ ответ выше). Вы просто получаете в mysql
и выполнить запрос, говоря root
отлично используя старый native_password
метод authnetication:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password ...
Хорошо, что жизнь будет простой, и вы все равно сможете без проблем использовать старые добрые инструменты, такие как Sequel Pro. Но проблема в том, что вы не используете более безопасные (и крутые, читайте ниже) материалы, доступные вам.
Вариант 2) Замените пакет "Node" на MySQL Connecter X DevAPI
MySQL X DevAPI для Node - это замена пакета Node Mysqljs, предоставленная официальными парнями http://dev.mysql.com.
Это работает как шарм, поддерживающий аутентификацию caching_sha2_password
. (Просто убедитесь, что вы используете порт 33060
для обмена данными по протоколу X).
Плохо то, что вы оставили наш старый пакет mysql
, к которому так привыкли все.
Хорошо, что ваше приложение теперь более защищено, и вы можете воспользоваться кучей новых вещей, которые не давали наши старые добрые друзья! Просто ознакомьтесь с руководством по X DevAPI, и вы увидите, что в нем есть масса новых сексуальных функций, которые могут пригодиться. Вам просто нужно заплатить цену обучения, которая, как ожидается, идет с любым обновлением технологии. :)
PS. К сожалению, в этом пакете XDevAPI еще нет определения типов (что понятно с помощью TypeScript), поэтому, если вы набираете текст, у вас будут проблемы. Я пытался сгенерировать .d.ts, используя dts-gen
и dtsmake
, но безуспешно. Так что имейте это в виду.
Ура!
Ответ 7
Оригинальную документацию вы можете найти здесь: 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);
});
Ответ 8
У меня MYSQL на сервере и приложение nodejs на другом сервере
Выполните следующий запрос в MYSQL Workbench
ALTER USER 'root' @'%' ИДЕНТИФИЦИРОВАНО С mysql_native_password BY 'password'
Ответ 9
Для существующих MySQL 8.0 устанавливается на Windows 10 MySQL,
(1) запустить установщик,
(2) нажмите "Переконфигурировать" под QuickAction (слева от MySQL Server), затем
(3) нажмите рядом, чтобы пройти через следующие 2 экрана до прибытия
(4) в разделе "Метод аутентификации" выберите "Использовать устаревший метод аутентификации (сохранить совместимость с MySQL 5.x").
(5) Продолжайте нажимать, пока установка не будет завершена
Ответ 10
Просто запустите установщик MySQL Server и переконфигурируйте мой SQL Server... Это сработало для меня.
Ответ 11
У меня такая же проблема с MySQL, и я решаю с помощью XAMPP для подключения к MySQL и остановки служб в Windows для MySQL (панель управления - Administrative Tools - Services) и в папке db.js (которая отвечает за базу данных) я сделайте пароль пустым (здесь вы можете увидеть :)
const mysql = require('mysql');
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: ''
});
Ответ 12
Способ, которым он в настоящее время структурирован, ожидает соединение сокета. Просто измените хост с localhost
на 127.0.0.1
как показано ниже, чтобы использовать стандартное соединение. Вы также должны будете предоставить порт. Порт по умолчанию - 3306
Ответ 13
Если вы столкнулись с этой ошибкой, но все еще хотите использовать MySQL версии 8. Вы можете сделать это, сказав MySQL Server использовать устаревший плагин аутентификации при создании базы данных с помощью Docker.
Итак, ваш составной файл будет выглядеть так:
# 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
Ответ 14
Проверьте привилегии и имя пользователя/пароль для вашего пользователя MySQL.
Для отлова ошибок всегда полезно использовать переопределенный метод _delegateError
. В вашем случае это должно выглядеть так:
var mysql = require('mysql');
var con = mysql.createConnection({
host: "localhost",
user: "root",
password: "password",
insecureAuth : true
});
var _delegateError = con._protocol._delegateError;
con._protocol._delegateError = function(err, sequence) {
if (err.fatal)
console.trace('MySQL fatal error: ' + err.message);
return _delegateError.call(this, err, sequence);
};
con.connect(function(err) {
if (err) throw err;
console.log("Connected!");
});
Эта конструкция поможет вам отследить фатальные ошибки.
Ответ 15
Если командная строка ALTER USER... не работает для вас И если вы используете Windows 10, попробуйте выполнить следующие действия:
1) Введите MySQL в строке поиска Windows
2) Откройте установщик MySQL для Windows - сообщество
3) Найдите "Сервер MySQL" и нажмите "Переконфигурировать"
4) Нажимайте "Далее", пока не дойдете до этапа "Метод аутентификации".
5) На этапе "Метод аутентификации" проверьте второй параметр "Использовать устаревший метод аутентификации"
6) Затем следуйте инструкциям установщика Windows до конца
7) Когда это будет сделано, перейдите в "Службы" в строке поиска Windows, нажмите "Пуск" MySql81 ".
Теперь попробуйте еще раз, соединение между MySQL и Node.js должно работать!