Sila tingkatkan klien MySQL: MySQL 8.0 - Pelanggan tidak menyokong protokol pengesahan yang diminta oleh pelayan
P粉574695215
P粉574695215 2023-10-10 09:34:48
0
2
754

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.<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)

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.

P粉574695215
P粉574695215

membalas semua(2)
P粉161939752

Ringkasan

  1. Jika anda hanya mahu menghapuskan pepijat, dengan kos risiko keselamatan projek (cth. ini hanyalah projek peribadi atau persekitaran pembangunan), gunakan @jawapan Pras -- ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password' 然后 刷新权限
  2. Jika anda ingin membetulkannya dan tidak tahu mengapa, hanya pasang dan gunakan mysql2 (而不是 mysql)并使用它 - npm我 mysql2mysql = require('mysql2');.
  3. Jika anda seorang pembangun yang ingin tahu dan sentiasa bersemangat untuk belajar, baca terus... :)

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 dalam 24. 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 dalam mysqljs a> untuk membetulkannya sekarang!

Kemas Kini Februari 2020: Nampaknya dirancang untuk masuk dalam mysqljs versi 3.

Kemas kini Julai 2020: Nampaknya ia belum masuk lagi (sekurang-kurangnya April 2020) , tetapi mendakwa bahawa node-mysql2 menyokong suis permintaan pengesahan Jika 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 garpu dan melaksanakannya - tetapi belum secara rasmi dalam pakej mysql.js lagi. Selain itu, berdasarkan komen di bawah, nampaknya pakej mysql2 berfungsi dengan baik dan menyokong penukaran pengesahan dengan 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 (seperti jawapan terbaik di atas). Anda hanya perlu memasukkan kaedah mysql 并运行一个查询,说明 root 可以使用旧的 mysql_native_password untuk mengesahkan:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password ...

Berita baiknya ialah, kehidupan menjadi lebih mudah dan anda masih boleh menggunakan alatan lama yang bagus seperti Sequel Pro tanpa sebarang 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

MySQL Ia berfungsi seperti sokongan untuk komunikasi protokol X. )

Sayangnya anda telah berpindah dari pakej lama caching_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 sahaja

X DevAPI Tutorial

dan 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. :)mysql PS. Malangnya, pakej XDevAPI ini belum mempunyai definisi jenis (yang TypeScript faham), jadi jika anda menggunakan

typescript

, 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!

npm un mysql && npm i mysql2

Nota, mysql2 是流行的 mysql 的一个分支,但它的受欢迎程度(4 月份 mysql2 每周下载量为 62 万次) 2020 年)已接近原始软件包(2021 年 4 月 mysql 720K muat turun setiap minggu), jadi nampaknya munasabah untuk menukar!

P粉198749929

Laksanakan pertanyaan berikut dalam MYSQL Workbench

更改用户 'root'@'localhost' 通过 mysql_native_password BY 'password' 进行识别;

di mana root adalah pengguna anda localhost sebagai URL anda dan password sebagai kata laluan anda

Kemudian jalankan pertanyaan ini untuk memuat semula kebenaran:

刷新权限;

Selepas melakukan ini cuba sambung menggunakan nod.

Jika ini tidak berkesan, cuba tanpa bahagian @'localhost'.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!