Atas sebab tertentu saya tidak dapat mewujudkan sambungan mudah ke pelayan. Saya memasang pangkalan data MySQL Community 8.0 terkini bersama-sama dengan Node.JS menggunakan tetapan lalai.
Ini kod node.js saya
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!"); });
Berikut ialah ralat yang terdapat dalam command prompt:
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.(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. (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)
Saya telah membaca sesuatu seperti: https://dev.mysql.com/doc/refman/5.5/en/old-client.html https://github.com/mysqljs/mysql/issues/1507
Tetapi saya masih tidak pasti bagaimana untuk menyelesaikan masalah saya.
Ringkasan
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'
然后刷新权限
mysql2
(而不是mysql
)并使用它 -npm我 mysql2
和mysql = require('mysql2');
.Apa yang berlaku?
Kita perlu memikirkan dahulu apa yang berlaku.
MySQL 8 menyokong kaedah pengesahan boleh pasang. Secara lalai, salah satu daripadanya bernama
caching_sha2_password
的密码,而不是我们的旧mysql_native_password
(sumber) digunakan. Nampaknya, algoritma penyulitan menggunakan berbilang jabat tangan adalah lebih selamat daripada laluan kata laluan biasa yang digunakan dalam24. Tahun!Kini, masalahnya ialah pakej dalam Node
mysqljs
(使用npm i mysql
yang memasang dan menggunakannya dalam kod Node) tidak menyokong kaedah pengesahan lalai baharu ini untuk MySQL 8 lagi. Isunya di sini:https://github.com/mysqljs/mysql/issues/1507 a> Sehingga Julai 2019, masih dibuka tiga tahun kemudian.Kemas kini Jun 2019:Ada PR baharu dalammysqljs a> untuk membetulkannya sekarang!
Kemas Kini Februari 2020:Nampaknyadirancang untuk masuk dalam mysqljs versi 3.
Kemas kini Julai 2020:Nampaknya ia belum masuklagi (sekurang-kurangnya April 2020), tetapimendakwabahawa node-mysql2 menyokong suispermintaan pengesahanJika
node-mysql2
berfungsi untuk anda, sila tinggalkan komen di bawah - Saya akan mengujinya sendiri kemudian.Kemas kini April 2021:Masalahnya nampaknya masih wujud, hanya 3 hari yang lalu,seseorang mencipta garpudan melaksanakannya - tetapi belum secara rasmi dalam pakej mysql.js lagi. Selain itu, berdasarkan komen di bawah, nampaknyapakej mysql2berfungsi dengan baik danmenyokong penukaran pengesahandengan betul.
Pilihan semasa anda
Pilihan 1) [Tidak Disyorkan] Turunkan taraf "MySQL" untuk menggunakan "mysql_native_password" lama untuk pengesahan
Inilah yang semua orang cadangkan di sini (sepertijawapan terbaik di atas). Anda hanya perlu memasukkan kaedah
mysql
并运行一个查询,说明root
可以使用旧的mysql_native_password
untuk mengesahkan:Berita baiknya ialah, kehidupan menjadi lebih mudah dan anda masih boleh menggunakan alatan lama yang bagus seperti Sequel Pro tanpasebarang soalan. Tetapi perkaranya ialah, anda tidak mengambil kesempatan daripada sesuatu yang lebih selamat (dan bagus, baca di bawah).
Pilihan 2) [Meh...] Gantikan pakej "Nod" dengan MySQL Connecter X DevAPI
MySQLIa berfungsi seperti sokonganuntuk komunikasi protokolX. )
Sayangnya anda telah berpindah dari pakej lama
X DevAPI Tutorialcaching_sha2_password
身份验证的超级按钮。 (只需确保您使用端口33060
yang setiap daripada kita biasa dan bergantung harap.Bonusnya ialah apl anda kini lebih selamat dan anda boleh memanfaatkan banyak ciri baharu yang tidak ditawarkan oleh rakan lama kami yang baik! Lihat sahajadan anda akan mendapati ia mempunyai banyak ciri seksi baharu yang boleh anda gunakan. Anda hanya perlu membayar harga keluk pembelajaran, yang dijangka datang dengan sebarang peningkatan teknologi. :)
typescriptmysql
PS. Malangnya, pakej XDevAPI ini belum mempunyai definisi jenis (yang TypeScript faham), jadi jika anda menggunakan, anda akan menghadapi masalah. Saya cuba menggunakan dts-gen dan dtsmake untuk menjana .d.ts tanpa berjaya. Jadi sila ingat ini.
Pilihan 3) [Disyorkan] Gantikan "mysql.js" dengan pakej "mysql2.js"
Seperti yang dinyatakan di atas, pakej mysql (pautan pakej NPM)masih mengalami masalah ini(sehingga April 2021). Tetapi pakej mysql2 (pautan pakej NPM) tidak. Jadi berikut mungkin jawapan yang mudah!
Nota,
mysql2
是流行的mysql
的一个分支,但它的受欢迎程度(4 月份mysql2
每周下载量为 62 万次) 2020 年)已接近原始软件包(2021 年 4 月mysql
720K muat turun setiap minggu), jadi nampaknya munasabah untuk menukar!Laksanakan pertanyaan berikut dalam MYSQL Workbench
更改用户 'root'@'localhost' 通过 mysql_native_password BY 'password' 进行识别;
di mana
root
adalah pengguna andalocalhost
sebagai URL anda danpassword
sebagai kata laluan andaKemudian jalankan pertanyaan ini untuk memuat semula kebenaran:
刷新权限;
Selepas melakukan ini cuba sambung menggunakan nod.
Jika ini tidak berkesan, cuba tanpa bahagian
@'localhost'
.