MySQL 8.0 - клиент не поддерживает протокол аутентификации, запрашиваемый сервером; рассмотреть вопрос об обновлении клиента MySQL - PullRequest
0 голосов
/ 30 апреля 2018

Я новичок в 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

Ответы [ 14 ]

0 голосов
/ 25 июня 2019

Если командная строка ALTER USER ... не работает для вас И если вы используете Windows 10, попробуйте выполнить следующие действия:

1) Введите MySQL в строке поиска Windows

2) Откройте установщик MySQL для Windows - сообщество

3) Найдите «Сервер MySQL» и нажмите «Переконфигурировать». step 3

4) Нажимайте «Далее», пока не достигнете фазы «Метод аутентификации»

5) На этапе «Метод аутентификации» проверьте второй параметр «Использовать устаревший метод аутентификации» step 5

6) Затем следуйте инструкциям установщика Windows до конца

7) Когда это будет сделано, перейдите в «Службы» в строке поиска Windows, нажмите «Пуск» MySql81 ».

Теперь, попробуйте еще раз, соединение между MySQL и Node.js должно работать!

0 голосов
/ 19 июня 2019

Если вы столкнулись с этой ошибкой, но все еще хотите использовать 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
0 голосов
/ 21 июня 2019

Проверьте привилегии и имя пользователя / пароль для вашего пользователя 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!");
});

Эта конструкция поможет вам отследить фатальные ошибки.

0 голосов
/ 08 февраля 2019

полных шагов для 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

Затем попробуйте подключиться, используя узел

0 голосов
/ 08 июня 2019

Давайте сначала проясним, что происходит.

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 года. (ОБНОВЛЕНИЕ июнь 2019: в mysqljs теперь исправляется новый PR это!)

Ваши варианты

Вариант 1) Понизьте версию «MySQL» для аутентификации, используя старый добрый «native_password»

Это то, что все предлагают здесь (например, верхний ответ выше ). Вы просто входите в mysql и запускаете запрос о том, что root нормально, используя старый метод native_password для аутентификации:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password ...

Хорошо, что жизнь будет простой, и вы все еще можете использовать старые добрые инструменты, такие как Sequel Pro, без каких-либо проблем . Но проблема в том, что вы не используете более безопасные (и крутые, читайте ниже) материалы, доступные вам.

Вариант 2) Заменить пакет "Node" на MySQL Connecter X DevAPI

MySQL X DevAPI для узла является заменой пакета Node's Mysqljs , предоставленного http://dev.mysql.com официальными парнями.

Работает как брелок, поддерживающий caching_sha2_password аутентификацию. (Просто убедитесь, что вы используете порт 33060 для X протокола обмена .)

Плохо то, что вы оставили наш старый пакет mysql, к которому все так привыкли и на который полагаются.

Хорошо, что ваше приложение теперь более защищено, и вы можете воспользоваться кучей новых вещей, которые не давали наши старые добрые друзья! Просто ознакомьтесь с руководством по для X DevAPI , и вы увидите, что в нем есть масса новых сексуальных функций, которые могут пригодиться. Вам просто нужно заплатить цену обучения, которая, как ожидается, идет с любым обновлением технологии. :)

PS. К сожалению, этот пакет XDevAPI еще не имеет определения типов (что понятно с помощью TypeScript), поэтому, если вы используете typcript , у вас будут проблемы. Я пытался сгенерировать .d.ts, используя dts-gen и dtsmake, но безуспешно. Так что имейте это в виду.

Ура!

0 голосов
/ 19 ноября 2018

Хотя принятый ответ правильный, я бы предпочел создать нового пользователя и затем использовать его для доступа к базе данных.

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';
0 голосов
/ 20 ноября 2018

У меня MYSQL на сервере и приложение nodejs на другом сервере

Выполните следующий запрос в MYSQL Workbench

ALTER USER 'root' @ '%' ИДЕНТИФИЦИРОВАНО С mysql_native_password BY 'password'

0 голосов
/ 19 августа 2018

Использование старых 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 еще не реализована. Вы можете просмотреть этот запрос на получение и этот выпуск для получения дополнительной информации. Вероятно, исправление скоро будет!

0 голосов
/ 05 сентября 2018

Для существующих установок mysql 8.0 в Windows 10 mysql,

(1) запуск установщика,

(2) нажмите «Переконфигурировать» под QuickAction (слева от MySQL Server), затем

(3) нажмите рядом, чтобы перейти на следующие 2 экрана до прибытия

(4) в «Методе аутентификации» выберите «Использовать устаревший метод аутентификации (сохранить совместимость с MySQL 5.x»)

(5) Продолжайте нажимать, пока установка не будет завершена

0 голосов
/ 14 августа 2018

В последнем док-контейнере Mysql

ALTER USER root IDENTIFIED WITH mysql_native_password BY 'password';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...