前言
最近用 Node 寫一個(gè)小玩意,需要用到 MySQL 數(shù)據(jù)庫(kù),現(xiàn)在用得最廣泛的是 mysql 這個(gè)庫(kù)。然后呢,現(xiàn)在 ORM 這么火,干脆也上 ORM 吧,正好我也不會(huì)可以學(xué)習(xí)一下,于是找到了 Sequelize.js 這個(gè) ORM 庫(kù)。
發(fā)現(xiàn)問題
看看 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 }});// ...后面還有一堆懶得貼了運(yùn)行一下
	SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:3306
什么鬼,為什么會(huì)出現(xiàn)這個(gè)錯(cuò)誤呢?我明明設(shè)置的是 localhost,為什么會(huì)變成 127.0.0.1?
解決問題
照例先谷歌,確實(shí)發(fā)現(xiàn)了很多人也遇到了這個(gè)問題,解決方法大概有這么幾種:
1、你丫以為不用裝 MySQL 就能跑了么?快去裝數(shù)據(jù)庫(kù)!
2、你數(shù)據(jù)庫(kù)運(yùn)行了么你?趕緊 /etc/init.d/mysqld start 運(yùn)行起來
3、端口寫錯(cuò)了
4、你是不是開啟了 skip-networking 這個(gè)選項(xiàng)?Remove it !
看到這里,我反應(yīng)過來了,因?yàn)槲业臄?shù)據(jù)庫(kù)不涉及到遠(yuǎn)程訪問,只要使用 Unix socket 通信就夠了,于是就啟用了 skip-networking 讓 MySQL 不監(jiān)聽指定端口。
先科普一下 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.
翻譯一下就是:
不要監(jiān)聽 TCP/IP 連接。所有與 mysqld 的交互必須使用命名管道或共享內(nèi)存(在 Windows 上)或 Unix socket 文件(在 Unix 上)。強(qiáng)烈建議對(duì)只允許本地客戶端的系統(tǒng)使用此選項(xiàng)。
來源
但是為了安全性,我并不想把這個(gè)選擇給移除,難道只好忍痛不用 ORM 了嗎?
因?yàn)榭戳宋臋n,mysql 這個(gè)連接庫(kù)是可以使用 socketPath 這個(gè)屬性指定 Unix 套接字文件,但是 Sequelize.js 沒發(fā)現(xiàn)有關(guān)屬性。
最后只好發(fā) issue,不久就有 dalao 回答說可以用 dialectOptions 設(shè)置 mysql 的屬性。
下面是測(cè)試成功的代碼:
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 }});就是這么簡(jiǎn)單…
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)VeVb武林網(wǎng)的支持。
新聞熱點(diǎn)
疑難解答