由於某種原因,我無法與伺服器建立簡單的連線。我使用預設設定安裝了最新的 MySQL Community 8.0 資料庫以及 Node.JS。
這是我的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!"); });
以下是命令提示字元中發現的錯誤:
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)
我讀過一些內容,例如: https://dev.mysql.com/doc/refman/5.5/en/old-client.html https://github.com/mysqljs/mysql/issues/1507
但我仍然不確定如何解決我的問題。
摘要
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'
然後刷新權限
mysql2
(而不是mysql
)並使用它-npm我mysql2
和mysql = require('mysql2');
。發生了什麼事?
我們首先要弄清楚發生了什麼事。
MySQL 8 支援可插入的身份驗證方法。預設情況下,使用其中一個名為
caching_sha2_password
的密碼,而不是我們的舊mysql_native_password
(來源)。顯然,使用多次握手的加密演算法比 24 中使用的普通密碼傳遞更安全。年!現在,問題是Node 中的
mysqljs
(使用npm i mysql
安裝並在Node 程式碼中使用它的軟體包)不支援這種新的預設驗證MySQL 8 的方法還沒有。問題在這裡: https://github.com/mysqljs/mysql/issues/1507 a> 截至 2019 年 7 月,三年後仍開放。2019 年 6 月更新:有一個 mysqljs 中的新 PR a> 現在就解決這個問題!
2020 年 2 月更新: 顯然它是計畫來的在 mysqljs 版本 3 中。
2020 年7 月更新: 顯然它還沒有出現在 中(截至至少2020 年4 月),但聲稱 node- mysql2 支援身份驗證切換請求。如果
node-mysql2
可以正常解決此問題,請在下面發表評論 - - 我稍後會親自測試一下。2021 年4 月更新: 問題似乎仍然存在,就在3 天前,有人創建了一個fork 並實現了它——但在mysql.js 包中還不是正式的。另外,根據下面的評論,似乎 mysql2 套件 工作正常並且 正確支援身份驗證切換。
您目前的選項
選項 1) [不建議] 降級「MySQL」以使用舊的「mysql_native_password」進行驗證
這就是每個人在這裡的建議(例如上面的最佳答案)。您只需進入
mysql
並執行一個查詢,說明root
可以使用舊的mysql_native_password
方法進行驗證:好消息是,生活會變得簡單,您仍然可以使用 Sequel Pro 等優秀的舊工具,而無需 任何問題。但問題是,您沒有利用更安全(而且很酷,請閱讀下文)的東西。
選項 2) [Meh...] 將「Node」套件替換為 MySQL Connecter X DevAPI
#MySQL X DevAPI for Node 是 Node 的 Mysqljs 套件,由 http://dev.mysql.com 官方人員。
它的工作原理就像一個支援
caching_sha2_password
驗證的超級按鈕。 (只需確保您使用連接埠33060
進行 X 協定通訊。)糟糕的是,你已經離開了我們每個人都習慣和依賴的舊
mysql
包。好處是,您的應用程式現在更加安全,您可以利用我們的好老朋友沒有提供的大量新功能!只要看看 X DevAPI 教學 並且你會發現它有大量新的性感功能可以派上用場。您只需要付出學習曲線的代價,預計會伴隨任何技術升級。 :)
PS。不幸的是,這個 XDevAPI 套件還沒有類型定義(TypeScript 可以理解),所以如果您使用 typescript,您將會遇到問題。我嘗試使用 dts-gen 和 dtsmake 產生 .d.ts,但沒有成功。所以請記住這一點。選項 3) [建議] 將「mysql.js」替換為「mysql2.js」套件
如上所述,mysql套件(NPM套件連結)是仍然存在此問題(截至 2021 年 4 月)。但 mysql2 套件(NPM 套件連結)不是。因此,以下可能應該是簡單的答案!
請注意,
mysql2
是流行的mysql
的一個分支,但它的受歡迎程度(4 月份mysql2
每週下載量為62 萬次) 2020 年)已接近原始軟體包(2021 年4 月mysql
每週下載720K),因此進行切換似乎很合理!在 MYSQL Workbench 中執行下列查詢
更改使用者 'root'@'localhost' 透過 mysql_native_password BY 'password' 進行辨識;
其中
root
作為您的用戶localhost
作為您的 URL 和password
作為您的密碼然後執行此查詢來刷新權限:
刷新權限;
#執行此操作後嘗試使用節點進行連線。
如果這不起作用,請嘗試不使用
@'localhost'
部分。