Pour une raison quelconque, je ne parviens pas à établir une simple connexion au serveur. J'ai installé la dernière base de données MySQL Community 8.0 avec Node.JS en utilisant les paramètres par défaut.
Voici 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!"); });
Voici les erreurs trouvées dans l'invite de commande :
C:Usersmysql-test>node app.js C:Usersmysql-testnode_modulesmysqllibprotocolParse 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:Usersmysql- testnode_modulesmysqllibprotocolsequencesSequence.js:52:14) at Handshake.ErrorPacket (C:Usersmysql-testnode_mo dulesmysqllibprotocolsequencesHandshake.js:130:18) at Protocol._parsePacket (C:Usersmysql-testnode_mo dulesmysqllibprotocolProtocol.js:279:23) at Parser.write (C:Usersmysql-testnode_modulesmys qllibprotocolParser.js:76:12) at Protocol.write (C:Usersmysql-testnode_modulesm ysqllibprotocolProtocol.js:39:16) at Socket.<anonymous> (C:Usersmysql-testnode_modul esmysqllibConnection.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:Usersmysql-testnode_module smysqllibprotocolProtocol.js:145:48) at Protocol.handshake (C:Usersmysql-testnode_modul esmysqllibprotocolProtocol.js:52:23) at Connection.connect (C:Usersmysql-testnode_modul esmysqllibConnection.js:130:18) at Object.<anonymous> (C:Usersmysql-testserver.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 quelque chose comme : https://dev.mysql.com/doc/refman/5.5/en/old-client.html https://github.com/mysqljs/mysql/issues/1507
Mais je ne sais toujours pas comment résoudre mon problème.
Résumé
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'
然后刷新权限
mysql2
(而不是mysql
)并使用它 -npm我 mysql2
和mysql = require('mysql2');
.Que s'est-il passé ?
Nous devons d’abord comprendre ce qui s’est passé.
MySQL 8 prend en charge les méthodes d'authentification enfichables. Par défaut, l'un d'eux nommé
caching_sha2_password
的密码,而不是我们的旧mysql_native_password
(source) est utilisé. Apparemment, l'algorithme de cryptage utilisant plusieurs poignées de main est plus sécurisé que la transmission normale de mot de passe utilisée dans 24. Année !Maintenant, le problème est que les packages dans Node
mysqljs
(使用npm i mysql
qui l'installent et l'utilisent dans le code Node) ne prennent pas encore en charge cette nouvelle méthode d'authentification par défaut pour MySQL 8. Le problème est ici : https://github.com/mysqljs/mysql/issues/1507 a> En juillet 2019, toujours ouvert trois ans plus tard.Mise à jour de juin 2019 : Il y a un nouveau PR dans mysqljs a> pour résoudre ce problème maintenant !
Mise à jour de février 2020 : Apparemment, il est prévu pour arriver dans la version 3 de mysqljs.
Mise à jour de juillet 2020 : Apparemment, ce n'est pas encore (au moins en avril 2020) , mais affirme que node-mysql2 prend en charge les demandes de changement d'authentification. Si
node-mysql2
fonctionne pour vous, veuillez laisser un commentaire ci-dessous – je le testerai moi-même plus tard.Mise à jour d'avril 2021 : Le problème semble toujours exister, il y a à peine 3 jours, quelqu'un a créé un fork et l'a implémenté - mais pas encore officiellement dans le package mysql.js. De plus, d'après les commentaires ci-dessous, il semble que le paquet mysql2 fonctionne correctement et prend correctement en charge le changement d'authentification.
Vos options actuelles
Option 1) [Non recommandé] Rétrogradez "MySQL" pour utiliser l'ancien "mysql_native_password" pour l'authentification
C'est ce que tout le monde suggère ici (comme la meilleure réponse ci-dessus). Il vous suffit de saisir la méthode
mysql
并运行一个查询,说明root
可以使用旧的mysql_native_password
pour vous authentifier :La bonne nouvelle est que la vie devient plus facile et que vous pouvez toujours utiliser de bons vieux outils comme Sequel Pro sans aucune question. Mais le problème est que vous ne profitez pas de quelque chose de plus sûr (et de plus cool, lisez ci-dessous).
Option 2) [Meh...] Remplacez le package "Node" par MySQL Connecter X DevAPI
MySQL Il fonctionne comme un support pour la communication selon le protocole X. )
Dommage que vous vous soyez éloigné de l'ancien forfait
X DevAPI Tutorialcaching_sha2_password
身份验证的超级按钮。 (只需确保您使用端口33060
auquel chacun d'entre nous était habitué et sur lequel il comptait. Le bonus, c'est que vos applications sont désormais plus sécurisées et que vous pouvez profiter de tonnes de nouvelles fonctionnalités que notre bon vieil ami n'offre pas ! Consultez simplement leet vous découvrirez qu'il contient des tonnes de nouvelles fonctionnalités sexy qui peuvent vous être utiles. Il vous suffit de payer le prix de la courbe d’apprentissage, qui accompagne toute mise à niveau technologique. :)
typescriptmysql
PS. Malheureusement, ce package XDevAPI n'a pas encore de définitions de type (que TypeScript comprend), donc si vous utilisez, vous aurez des problèmes. J'ai essayé d'utiliser dts-gen et dtsmake pour générer le .d.ts sans succès. Alors s’il vous plaît, gardez cela à l’esprit.
Option 3) [Recommandé] Remplacez "mysql.js" par le package "mysql2.js"
Comme mentionné ci-dessus, le package mysql (lien du package NPM) a toujours ce problème (en avril 2021). Mais le package mysql2 (lien du package NPM) ne l'est pas. Donc ce qui suit devrait probablement être la réponse facile !
Remarque,
mysql2
是流行的mysql
的一个分支,但它的受欢迎程度(4 月份mysql2
每周下载量为 62 万次) 2020 年)已接近原始软件包(2021 年 4 月mysql
720K téléchargements par semaine), il semble donc raisonnable de faire le changement !Exécutez la requête suivante dans MYSQL Workbench
更改用户 'root'@'localhost' 通过 mysql_native_password BY 'password' 进行识别;
où
root
se trouve votre utilisateurlocalhost
comme URL etpassword
comme mot de passeEnsuite, exécutez cette requête pour actualiser les autorisations :
刷新权限;
Après cela, essayez de vous connecter à l'aide d'un nœud.
Si cela ne fonctionne pas, essayez sans la partie
@'localhost'
.