Z jakiegoś powodu nie mogę nawiązać prostego połączenia z serwerem. Instaluję najnowszą bazę danych MySQL Community 8.0 wraz z Node.JS z ustawieniami domyślnymi.
To jest mój kod 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!");
});
Poniżej znajduje się błąd znaleziony w wierszu polecenia:
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)
Przeczytałem o niektórych rzeczach, takich jak: https://dev.mysql.com/doc/refman/5.5/en/old-client.html https://github.com/mysqljs/mysql/issues/1507
Ale nadal nie jestem pewien, jak rozwiązać mój problem. Każda pomoc byłaby mile widziana: D
Odpowiedzi:
Wykonaj następujące zapytanie w MYSQL Workbench
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'
Gdzie
root
jako użytkowniklocalhost
jako adres URL ipassword
hasłoNastępnie uruchom to zapytanie, aby odświeżyć uprawnienia:
flush privileges;
Spróbuj to zrobić za pomocą węzła.
Jeśli to nie zadziała, spróbuj bez
@'localhost'
części.źródło
flush privileges;
później.caching_sha2_password
został wprowadzony w MySQL 8.0, ale wersja Node.js nie jest jeszcze zaimplementowana.Najpierw wyjaśnijmy, co się dzieje.
MySQL 8 obsługuje metody uwierzytelniania z możliwością podłączenia. Domyślnie
caching_sha2_password
używany jest jeden z nich o nazwie, a nie nasz stary dobrymysql_native_password
( źródło ). Powinno być oczywiste, że użycie algorytmu kryptograficznego z kilkoma uściskami dłoni jest bezpieczniejsze niż zwykłe przekazywanie hasła, które istnieje od 24 lat !Teraz problem występuje
mysqljs
w węźle (pakiet, który instalujesznpm i mysql
i używasz go w kodzie węzła), nie obsługuje jeszcze tej nowej domyślnej metody uwierzytelniania MySQL 8. Problem znajduje się tutaj: https://github.com/mysqljs/mysql/issues/1507 i jest nadal otwarty po 3 latach od lipca 2019 r.(AKTUALIZACJA czerwiec 2019: W mysqljs jest teraz nowy PR, aby to naprawić! ) (AKTUALIZACJA luty 2020: Najwyraźniej planowane jest wydanie wersji 3 mysqljs . )
Twoje opcje
Opcja 1) Zmień wersję „MySQL” w celu uwierzytelnienia przy użyciu starego, dobrego „hasła natywnego”
To wszyscy sugerują tutaj (np. Najwyższa odpowiedź powyżej ). Wystarczy wejść
mysql
i uruchomić kwerendę mówiącroot
jest w porządku stosując starąnative_password
metodę authnetication:Dobrą rzeczą jest to, że życie będzie proste i nadal będziesz mógł używać starych dobrych narzędzi, takich jak Sequel Pro, bez żadnych problemów . Ale problem polega na tym, że nie korzystasz z bezpieczniejszych (i fajnych, przeczytaj poniżej) rzeczy dostępnych dla ciebie.
Opcja 2) Zamień pakiet „Węzeł” na MySQL Connecter X DevAPI
MySQL X DevAPI for Node jest zamiennikiem pakietu Mysqljs firmy Node , udostępnionego przez oficjalnych facetów http://dev.mysql.com .
Działa jak urok wspierający
caching_sha2_password
uwierzytelnianie. (Upewnij się tylko, że używasz portu33060
do komunikacji X Protocol ).Złe jest to, że opuściłeś nasz stary
mysql
pakiet, do którego wszyscy są przyzwyczajeni.Dobrą rzeczą jest to, że Twoja aplikacja jest teraz bezpieczniejsza i możesz skorzystać z mnóstwa nowych rzeczy, których nie dostarczali nasi starzy dobrzy przyjaciele! Wystarczy zapoznać się z samouczkiem X DevAPI, a zobaczysz, że ma mnóstwo nowych seksownych funkcji, które mogą się przydać. Trzeba tylko zapłacić cenę za krzywą uczenia się, która prawdopodobnie pojawi się wraz z każdą aktualizacją technologii. :)
PS. Niestety ten pakiet XDevAPI nie ma jeszcze definicji typów (zrozumiałej dla TypeScript), więc jeśli używasz maszynopisu , będziesz mieć problemy. Próbowałem wygenerować .d.ts przy użyciu
dts-gen
idtsmake
, ale bez powodzenia. Miej to na uwadze.Twoje zdrowie!
źródło
Korzystanie ze starych
mysql_native_password
prac:Jest tak, ponieważ
caching_sha2_password
wprowadzono go w MySQL 8.0, ale wersja Node.js nie jest jeszcze zaimplementowana. Możesz zobaczyć to żądanie ściągnięcia i ten problem, aby uzyskać więcej informacji. Prawdopodobnie poprawka pojawi się wkrótce!źródło
Pełne kroki dla MySQL 8
Połącz się z MySQL
Zresetuj swoje hasło
(Zastąp
your_new_password
hasło, którego chcesz użyć)Następnie spróbuj połączyć się za pomocą węzła
źródło
Chociaż zaakceptowana odpowiedź jest prawidłowa, wolałbym utworzyć nowego użytkownika, a następnie użyć go do uzyskania dostępu do bazy danych.
źródło
Jeśli napotkałeś ten błąd, ale nadal chciałeś używać
MySQL
wersji 8. Możesz to zrobić, informując MySQL Server, aby używał starszej wtyczki uwierzytelniającej podczas tworzenia bazy danychDocker
.Twój
compose
plik będzie wyglądał następująco:źródło
command
, ale wciąż pojawia się nieobsługiwany komunikat o błędzie uwierzytelnienia podczas używaniamysql
w Node.jsError: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
W Mysql Najnowszy kontener dokerów
źródło
Jeśli wiersz polecenia ALTER USER ... nie działa dla Ciebie ORAZ jeśli używasz systemu Windows 10, spróbuj wykonać następujące kroki:
1) Wpisz MySQL w pasku wyszukiwania systemu Windows
2) Otwórz Instalator Windows MySQL - Społeczność
3) Poszukaj „serwera MySQL” i kliknij przycisk Konfiguruj ponownie
4) Klikaj „Dalej”, aż dojdziesz do fazy „Metoda uwierzytelnienia”
5) W fazie „Metoda uwierzytelnienia” zaznacz drugą opcję „Użyj starszej metody uwierzytelnienia”
6) Następnie postępuj zgodnie z instrukcjami podanymi przez instalatora Windows do końca
7) Po zakończeniu przejdź do „Usługi” z paska wyszukiwania Windows, kliknij „uruchom” MySql81.
Teraz spróbuj ponownie, połączenie między MySQL i Node.js powinno działać!
źródło
Większość odpowiedzi w tym pytaniu powoduje obniżenie poziomu mechanizmu uwierzytelniania z
caching_sha2_password
namysql_native_password
. Z punktu widzenia bezpieczeństwa jest to dość rozczarowujące.Ten dokument obszernie omawia
caching_sha2_password
i oczywiście, dlaczego NIE powinien być pierwszym wyborem obniżenia metody uwierzytelniania.W związku z tym uważam, że odpowiedź Aidina powinna być odpowiedzią zaakceptowaną. Zamiast obniżyć klasę metody uwierzytelniania, użyj łącznika pasującego do wersji serwera.
źródło
Oryginalną dokumentację można znaleźć tutaj: https://dev.mysql.com/doc/dev/connector-nodejs/8.0/
źródło
Mam MYSQL na serwerze i aplikację nodejs na innym serwerze
Wykonaj następujące zapytanie w MYSQL Workbench
ZMIEŃ UŻYTKOWNIKA „root” @ „%” IDENTYFIKOWANY ZA POMOCĄ mysql_native_password BY „hasło”
źródło
W przypadku istniejących mysql instaluje się w mysql Windows 10,
(1) uruchom instalator,
(2), a następnie kliknij „Zmień konfigurację” w QuickAction (po lewej stronie MySQL Server)
(3) kliknij przycisk Dalej, aby przejść przez kolejne 2 ekrany do przybycia
(4) w „Metoda uwierzytelniania” wybierz „Użyj starszej metody uwierzytelnienia (zachowaj zgodność z MySQL 5.x”)
(5) Klikaj, aż instalacja się zakończy
źródło
W MySQL 8+ nowe domyślne uwierzytelnianie jest
caching_sha2_password
zamiastmysql_native_password
. Nowa i bardziej bezpieczna metoda uwierzytelniania nie jest jeszcze obsługiwana przezmysql
pakiet macierzysty , ale należy rozważyć użycie pakietu@mysql/xdevapi
, który jest oficjalnie obsługiwany i obsługiwany przez Oracle.Aby zainstalować nowy pakiet, uruchom:
Aby połączyć się z bazą danych i WSTAWIĆ niektóre WARTOŚCI:
Oficjalna dokumentacja pakietu znajduje się tutaj: https://dev.mysql.com/doc/dev/connector-nodejs/8.0/
źródło
Jeśli używasz dokera, zadziałało to dla mnie!
w
docker-compose.yml
dodaj następujące wiersze:potem
down
pojemnik iup
jeszcze raz.źródło
Oprócz powyższych odpowiedzi; Po wykonaniu poniższej komendy
Jeśli pojawi się błąd jako:
Następnie spróbuj w cmd jako admin; ustaw ścieżkę do folderu bin serwera MySQL w cmd
a następnie uruchom polecenie:
Powinno to zaktualizować serwer i tabele systemowe.
Następnie powinieneś być w stanie pomyślnie uruchomić poniższe polecenia w zapytaniu w środowisku roboczym:
pamiętaj, aby wykonać następujące polecenie:
Po wykonaniu wszystkich tych kroków powinno być możliwe nawiązanie połączenia z bazą danych MySQL. Mam nadzieję że to pomoże...
źródło
Wystarczy uruchomić instalator serwera MySQL i ponownie skonfigurować My SQL Server ... To zadziałało dla mnie.
źródło
Sprawdź uprawnienia i nazwę użytkownika / hasło dla użytkownika MySQL.
Do wychwytywania błędów zawsze przydatna jest
_delegateError
metoda przesłonięta . W twoim przypadku musi to wyglądać następująco:Ta konstrukcja pomoże ci prześledzić krytyczne błędy.
źródło
Właśnie to rozgryzłem po wypróbowaniu wielu rzeczy. To, co w końcu mi zrobiło, to dodanie
require('dotenv').config()
do mojego.sequelizerc
pliku. Najwyraźniej sequelize-cli nie czyta zmiennych env.źródło
Obniżenie klasy może nie być dobrym rozwiązaniem, ponieważ:
Możesz użyć
mysql2
pakietu zamiastmysql
. Jego API jest w większości kompatybilne z mysqljs. Obiecuje także wsparcie.Używaj go jak:
const mysql = require('mysql2/promise')
Możesz przeczytać więcej o
mysql2
tutaj: https://www.npmjs.com/package/mysql2Mam nadzieję, że to pomoże. :)
źródło
Możesz pominąć ORM, konstruktory itp. I uprościć zarządzanie DB / SQL za pomocą
sqler
isqler-mdb
.źródło
Mam ten sam problem z MySQL i rozwiązuję go za pomocą XAMPP do łączenia się z MySQL i zatrzymywania usług w systemie Windows dla MySQL (panel sterowania - Narzędzia administracyjne - Usługi) oraz w folderze db.js (odpowiedzialnym za bazę danych) I pozostaw hasło puste (tutaj możesz zobaczyć :)
źródło