Ich bin ein node.js und MySQL-Anfänger und habe gerade angefangen, ein paar grundlegende Codes einzurichten und auszuprobieren. Ich kann jedoch aus irgendeinem Grund nicht einmal eine einfache Verbindung zum Server herstellen. Ich installiere die neueste MySQL Community 8.0-Datenbank zusammen mit Node.JS mit Standardeinstellungen.
Dies ist mein node.js Code
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!");
});
Unten ist der Fehler in der Eingabeaufforderung:
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)
Ich habe einige Dinge gelesen wie: https://dev.mysql.com/doc/refman/5.5/de/old-client.htmlhttps: // github.com/mysqljs/mysql/issues/1507
Ich bin mir immer noch nicht sicher, wie ich mein Problem beheben kann. Jede Hilfe wäre dankbar: D
Führen Sie die folgende Abfrage in MYSQL Workbench aus
ALTER USER 'root' @ 'localhost' IDENTIFIED WITH mysql_native_password BY 'password'
Versuchen Sie, eine Verbindung mit dem Knoten herzustellen, nachdem Sie dies getan haben
Verwenden der alten mysql_native_password
-Werke:
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;
Dies liegt daran, dass caching_sha2_password
in MySQL 8.0 eingeführt wurde, die Version Node.js jedoch noch nicht implementiert ist. Diese Pull-Anfrage und Dieses Problem für weitere Informationen. Wahrscheinlich wird es bald eine Lösung geben!
Lassen Sie uns zunächst klarstellen, was los ist.
MySQL 8 unterstützt steckbare Authentifizierungsmethoden. Standardmäßig wird einer von ihnen mit dem Namen caching_sha2_password
verwendet und nicht unser guter alter mysql_native_password
( source ). Es sollte offensichtlich sein, dass die Verwendung eines Krypto-Algorithmus mit mehreren Handshakes sicherer ist als die einfache Übergabe von Passwörtern, die es seit 24 Jahren gibt !
Das Problem ist nun mysqljs
in Node (das Paket, das Sie mit npm i mysql
installieren und in Ihrem Node Code verwenden), unterstützt diesen neuen Standard nicht Authentifizierungsmethode von MySQL 8 noch. Die Ausgabe befindet sich hier: https://github.com/mysqljs/mysql/issues/1507 und ist nach 3 Jahren ab Juli 2019 noch offen. (UPDATE Juni 2019: Es gibt eine neue PR in mysqljs , um dies zu beheben!)
Das schlagen alle hier vor (z. B. Antwort oben ). Sie müssen nur mysql
aufrufen und eine Abfrage ausführen, in der angegeben wird, dass root
für die Authentifizierung die alte Methode native_password
verwendet:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password ...
Das Gute ist, das Leben wird einfach und Sie können immer noch gute alte Tools wie Sequel Pro ohne irgendein Problem verwenden. Das Problem ist jedoch, dass Sie keine sichereren (und cooleren, siehe unten) Dinge nutzen, die Ihnen zur Verfügung stehen.
MySQL X DevAPI für Node ist ein Ersatz für Nodes Mysqljs-Paket , bereitgestellt von http: // dev.mysql.com offizielle Jungs.
Es funktioniert wie ein Zauber, der die caching_sha2_password
-Authentifizierung unterstützt. (Stellen Sie einfach sicher, dass Sie Port 33060
für X-Protokollkommunikation verwenden.)
Das Schlimme ist, dass Sie unser altes mysql
-Paket verlassen haben, an das jeder so gewöhnt ist und auf das sich jeder verlässt.
Das Gute ist, dass Ihre App jetzt sicherer ist und Sie eine Menge neuer Dinge nutzen können, die unsere guten alten Freunde nicht zur Verfügung gestellt haben! Schauen Sie sich einfach das Tutorial von X DevAPI an und Sie werden sehen, dass es eine Menge neuer sexy Funktionen enthält, die sich als nützlich erweisen können. Sie müssen nur den Preis für eine Lernkurve bezahlen, die mit jedem Technologie-Upgrade einhergeht. :)
PS. Leider hat dieses XDevAPI-Paket noch keine Typendefinition (verständlich für TypeScript). Wenn Sie also auf TypeScript sind, werden Sie Probleme haben. Ich habe versucht, .d.ts mit dts-gen
und dtsmake
zu generieren, aber kein Erfolg. Denken Sie also daran.
Prost!
Obwohl die akzeptierte Antwort korrekt ist, würde ich es vorziehen, einen neuen Benutzer zu erstellen und diesen Benutzer dann für den Zugriff auf die Datenbank zu verwenden.
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]';
Wenn dieser Fehler auftritt, Sie jedoch weiterhin MySQL Version 8 verwenden möchten, können Sie dies tun, indem Sie MySQL Server anweisen, das Legacy-Authentifizierungs-Plugin zu verwenden, wenn Sie die Datenbank mit Docker erstellen.
Ihre Compose-Datei sieht also so aus:
# 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
Wenn die Befehlszeile ALTER USER ... bei Ihnen nicht funktioniert UND Sie Windows 10 verwenden, versuchen Sie, die folgenden Schritte auszuführen:
1) Geben Sie MySQL in die Windows-Suchleiste ein
2) Öffnen Sie den MySQL Windows Installer - Community
3) Suchen Sie nach "MySQL Server" und klicken Sie auf Neu konfigurieren
4) Klicken Sie auf "Weiter", bis Sie die Phase "Authentifizierungsmethode" erreicht haben
5) Aktivieren Sie in der Phase "Authentifizierungsmethode" die zweite Option "Legacy-Authentifizierungsmethode verwenden"
6) Folgen Sie dann den Anweisungen des Windows-Installationsprogramms bis zum Ende
7) Wenn Sie fertig sind, gehen Sie in der Windows-Suchleiste zu "Dienste" und klicken Sie auf "Start" MySql81 ".
Versuchen Sie es jetzt noch einmal, die Verbindung zwischen MySQL und Node.js sollte funktionieren!
In Mysql Letzter Docker-Container
ALTER USER root IDENTIFIED WITH mysql_native_password BY 'password';
Originaldokumentation finden Sie hier: 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);
});
Ich habe MYSQL auf einem Server und einer nodejs-Anwendung auf einem anderen Server
Führen Sie die folgende Abfrage in MYSQL Workbench aus
ALTER USER 'root' @ '%' IDENTIFIED WITH mysql_native_password BY 'password'
Führen Sie einfach den MySQL Server Installer aus und konfigurieren Sie den My SQL Server neu ... Das hat für mich funktioniert.
Für bestehende Installationen von mysql 8.0 unter Windows 10 mysql (1) Starten Sie das Installationsprogramm (2) Klicken Sie unter QuickAction auf "recongifure" (links von MySQL Server) 1 und dann (3) Wählen Sie als nächstes durch die nächsten 2 Bildschirme bis zum Eintreffen von (4) unter "Authentifizierungsmethode". Wählen Sie "Legacy-Authentifizierungsmethode verwenden (Kompatibilität mit MySQL 5.x beibehalten)" 2 (5)
Überprüfen Sie die Berechtigungen und den Benutzernamen/das Kennwort für Ihren MySQL-Benutzer.
Zum Abfangen von Fehlern ist es immer nützlich, die überschriebene _delegateError
-Methode zu verwenden. In Ihrem Fall muss dies so aussehen:
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!");
});
Diese Konstruktion hilft Ihnen, schwerwiegende Fehler aufzuspüren.
Ich habe das gleiche Problem mit MySQL und löse es, indem ich mit XAMPP eine Verbindung mit MySQL herstelle und die Dienste in Windows für MySQL (Systemsteuerung - Verwaltung - Dienste) und im Ordner db.js (für die Datenbank verantwortliche) stoppe mach das Passwort leer (hier kannst du sehen :)
const mysql = require('mysql');
const connection = mysql.createConnection({
Host: 'localhost',
user: 'root',
password: ''
});
Stellen Sie eine Verbindung zu MySQL her und setzen Sie Ihr Kennwort mit den folgenden Anweisungen zurück
$ mysql -u root -p
Enter password: (enter your root password)
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_password';
mysql> FLUSH PRIVILEGES;
mysql> quit
Versuchen Sie dann, die Verbindung über den Knoten herzustellen