Je suis un débutant de node.js et MySQL et je viens de commencer à configurer et à essayer du code de base. Cependant, je ne peux même pas établir une simple connexion au serveur pour une raison quelconque. J'installe la dernière base de données MySQL Community 8.0 avec Node.JS avec les paramètres par défaut.
Ceci est mon code 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!");
});
Ci-dessous l’erreur trouvée dans l’invite de commande:
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)
J'ai lu certaines choses telles que: https://dev.mysql.com/doc/refman/5.5/fr/old-client.htmlhttps://github.com/mysqljs/ mysql/issues/1507
Mais je ne sais toujours pas comment régler mon problème. Toute aide serait appréciée: D
Exécuter la requête suivante dans MYSQL Workbench
ALTER USER 'root' @ 'localhost' IDENTIFIÉ AVEC mysql_native_password BY 'password'
Essayez de vous connecter en utilisant noeud après cela.
Utiliser l'ancien mysql_native_password
fonctionne:
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;
Ceci est dû au fait que caching_sha2_password
est introduit dans MySQL 8.0, mais que la version de Node.js n’est pas encore implémentée. Vous pouvez voir cette demande d'extraction et ce problème pour plus d'informations. Probablement un correctif viendra bientôt!
Commençons par clarifier ce qui se passe.
MySQL 8 supporte les méthodes d'authentification enfichables. Par défaut, l'un d'entre eux nommé caching_sha2_password
est utilisé plutôt que notre bon vieux mysql_native_password
( source ). Il devrait être évident que l’utilisation d’un algorithme de chiffrement avec plusieurs handshakes est plus sûre que le mot de passe en clair qui existe depuis 24 ans !
Maintenant, le problème est mysqljs
dans Node (le paquet que vous installez avec npm i mysql
et que vous l'utilisez dans votre code Node] ne supporte pas ce nouveau paramètre par défaut. méthode d'authentification de MySQL 8, pour le moment. Le problème se trouve ici: https://github.com/mysqljs/mysql/issues/1507 et est toujours ouvert après 3 ans à compter de juillet 2019. (MISE À JOUR Juin 2019: Il y a un nouveau PR dans mysqljs maintenant pour résoudre ce problème!)
C'est ce que tout le monde suggère ici (par exemple: réponse en haut ci-dessus ). Vous venez juste d'entrer dans mysql
et d'exécuter une requête disant que root
est correct en utilisant l'ancienne méthode native_password
pour l'auto-identification:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password ...
La bonne chose est que la vie sera simple et que vous pourrez toujours utiliser de bons vieux outils comme Sequel Pro sans aucun problème . Mais le problème, c’est que vous ne tirez pas parti d’une offre plus sûre (et plus cool, à lire ci-dessous).
MySQL X DevAPI pour Node remplace le paquet Mysqljs du nœud , fourni par http://dev.mysql.com mecs officiels.
Cela fonctionne comme un charme supportant caching_sha2_password
authentification. (Assurez-vous simplement que vous utilisez le port 33060
pour communications avec le protocole X .)
Le problème, c’est que vous avez quitté notre ancien paquetage mysql
auquel tout le monde est habitué et sur lequel on compte.
Le bon côté des choses, c’est que votre application est plus sécurisée maintenant et que vous pouvez profiter d’une tonne de nouveautés que nos bons vieux amis n’ont pas fournies! Il suffit de consulter le tutoriel de X DevAPI et vous verrez qu'il contient une tonne de nouvelles fonctionnalités sexy qui peuvent vous être utiles. Vous avez juste besoin de payer le prix d’une courbe d’apprentissage, qui devrait venir avec toute mise à niveau technologique. :)
PS Malheureusement, ce paquet XDevAPI n'a pas encore de types définition (compréhensible par TypeScript), donc si vous êtes sur TypeScript , vous aurez des problèmes. J'ai essayé de générer des fichiers .d.ts en utilisant dts-gen
et dtsmake
, mais sans succès. Alors garde cela en tête.
À votre santé!
Bien que la réponse acceptée soit correcte, je préfère créer un nouvel utilisateur, puis l’utiliser pour accéder à la base de données.
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';
Si vous rencontrez cette erreur mais souhaitez tout de même utiliser MySQL version 8. Pour ce faire, vous pouvez indiquer à MySQL Server d’utiliser le plug-in d’authentification hérité lorsque vous créez la base de données à l'aide de Docker.
Donc, votre fichier de composition ressemblera à ceci:
# 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
Si la ligne de commande ALTER USER ... ne fonctionne pas pour vous ET si vous utilisez Windows 10, essayez de suivre les étapes suivantes:
1) Tapez MySQL dans la barre de recherche de Windows
2) Ouvrez MySQL Windows Installer - Communauté
3) Recherchez "serveur MySQL" et cliquez sur Reconfigurer
4) Cliquez sur "Suivant" jusqu'à la phase "Méthode d'authentification".
5) Dans la phase "Méthode d’authentification", cochez la deuxième option "Utiliser la méthode d’authentification classique"
6) Suivez ensuite les étapes données par le programme d’installation Windows jusqu’à la fin.
7) Une fois terminé, allez dans "Services" dans la barre de recherche Windows, cliquez sur "démarrer" MySql81 ".
Maintenant, essayez encore, la connexion entre MySQL et Node.js devrait fonctionner!
Dans Mysql Dernier conteneur de docker
ALTER USER root IDENTIFIED WITH mysql_native_password BY 'password';
Vous trouverez la documentation originale ici: 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);
});
J'ai MYSQL sur le serveur et l'application nodejs sur un autre serveur
Exécuter la requête suivante dans MYSQL Workbench
ALTER USER 'root' @ '%' IDENTIFIÉ AVEC mysql_native_password BY 'password'
Il suffit d’exécuter le programme d’installation du serveur MySQL et de reconfigurer My SQL Server ... Cela a fonctionné pour moi.
Pour les installations existantes de mysql 8.0 sur Windows 10 mysql, (1) lancez le programme d'installation, cliquez sur "Recongifure" sous QuickAction (à gauche de MySQL Server) 1 , puis sur (3). Cliquez sur Suivant pour passer à travers les 2 écrans suivants jusqu'à arriver (4) sous "Méthode d'authentification", sélectionnez "Utiliser la méthode d'authentification héritée (conserver la compatibilité MySQL 5.x") 2 (5) Cliquez jusqu'à ce que l'installation soit terminée
Vérifiez les privilèges et le nom d'utilisateur/mot de passe de votre utilisateur MySQL.
Pour détecter les erreurs, il est toujours utile d'utiliser la méthode _delegateError
surchargée. Dans votre cas, cela doit ressembler à:
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!");
});
Cette construction vous aidera à localiser les erreurs fatales.
J'ai le même problème avec MySQL et je résous en utilisant XAMPP pour me connecter à MySQL et arrêter les services dans Windows pour MySQL (panneau de configuration - Outils d'administration - Services) et dans le dossier db.js (responsable de la base de données) I Rendez le mot de passe vide (ici vous pouvez voir :)
const mysql = require('mysql');
const connection = mysql.createConnection({
Host: 'localhost',
user: 'root',
password: ''
});
Connectez-vous à MySQL et réinitialisez votre mot de passe en utilisant les éléments suivants
$ 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
Ensuite, essayez de vous connecter en utilisant noeud