解決Node.js使用MySQL出現connect ECONNREFUSED 127.0.0.1:3306的問題,connecteconnrefused
前言
最近用 Node 寫一個小玩意,需要用到 MySQL 資料庫,現在用得最廣泛的是 mysql 這個庫。然後呢,現在 ORM 這麼火,乾脆也上 ORM 吧,正好我也不會可以學習一下,於是找到了 Sequelize.js 這個 ORM 庫。
發現問題
看看 Sequelize 的文檔,so easy,兩分鐘搞定~
import Sequelize from 'sequelize';let sequelize = new Sequelize('database', 'username', 'password', { host: 'localhost', port: 3306, dialect: 'mysql', pool: { max: 5, min: 0, idle: 10000 }});// ...後面還有一堆懶得貼了
運行一下
SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:3306
什麼鬼,為什麼會出現這個錯誤呢?我明明設定的是 localhost,為什麼會變成 127.0.0.1?
解決問題
照例先Google,確實發現了很多人也遇到了這個問題,解決方案大概有這麼幾種:
1、你丫以為不用裝 MySQL 就能跑了嗎?快去裝資料庫!
2、你資料庫運行了麼你?趕緊 /etc/init.d/mysqld start 運行起來
3、連接埠寫錯了
4、你是不是開啟了 skip-networking 這個選項?Remove it !
看到這裡,我反應過來了,因為我的資料庫不涉及到遠端存取,只要使用 Unix socket 通訊就夠了,於是就啟用了 skip-networking 讓 MySQL 不監聽指定連接埠。
先科普一下 skip-networking 是什麼
Do not listen for TCP/IP connections at all. All interaction with mysqld must be made using named pipes or shared memory (on Windows) or Unix socket files (on Unix). This option is highly recommended for systems where only local clients are permitted.
翻譯一下就是:
不要監聽 TCP/IP 串連。所有與 mysqld 的互動必須使用具名管道或共用記憶體(在 Windows 上)或 Unix socket 檔案(在 Unix 上)。強烈建議對只允許本地用戶端的系統使用此選項。
來源
但是為了安全性,我並不想把這個選擇給移除,難道只好忍痛不用 ORM 了嗎?
因為看了文檔,mysql 這個串連庫是可以使用 socketPath 這個屬性指定 Unix 通訊端檔案,但是 Sequelize.js 沒發現有關屬性。
最後只好發 issue,不久就有 dalao 回答說可以用 dialectOptions 設定 mysql 的屬性。
下面是測試成功的代碼:
import Sequelize from 'sequelize';let sequelize = new Sequelize('database', 'username', 'password', { host: 'localhost', port: 3306, dialect: 'mysql', dialectOptions: { socketPath: '/tmp/mysql.sock' // 指定通訊端檔案路徑 } pool: { max: 5, min: 0, idle: 10000 }});
就是這麼簡單…
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的協助,如果有疑問大家可以留言交流,謝謝大家對幫客之家的支援。