解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
前言
最近用Node写一个小玩意,需要用到MySQL数据库,现在用得最广泛的是mysql这个库。然后呢,现在ORM这么火,干脆也上ORM吧,正好我也不会可以学习一下,于是找到了Sequelize.js这个ORM库。
发现问题
看看Sequelize的文档,soeasy,两分钟搞定~
importSequelizefrom'sequelize'; letsequelize=newSequelize('database','username','password',{ host:'localhost', port:3306, dialect:'mysql', pool:{ max:5, min:0, idle:10000 } }); //...后面还有一堆懒得贴了
运行一下
SequelizeConnectionRefusedError:connectECONNREFUSED127.0.0.1:3306
什么鬼,为什么会出现这个错误呢?我明明设置的是localhost,为什么会变成127.0.0.1?
解决问题
照例先谷歌,确实发现了很多人也遇到了这个问题,解决方法大概有这么几种:
1、你丫以为不用装MySQL就能跑了么?快去装数据库!
2、你数据库运行了么你?赶紧/etc/init.d/mysqldstart运行起来
3、端口写错了
4、你是不是开启了skip-networking这个选项?Removeit!
看到这里,我反应过来了,因为我的数据库不涉及到远程访问,只要使用Unixsocket通信就够了,于是就启用了skip-networking让MySQL不监听指定端口。
先科普一下skip-networking是什么
DonotlistenforTCP/IPconnectionsatall.Allinteractionwithmysqldmustbemadeusingnamedpipesorsharedmemory(onWindows)orUnixsocketfiles(onUnix).Thisoptionishighlyrecommendedforsystemswhereonlylocalclientsarepermitted.
翻译一下就是:
不要监听TCP/IP连接。所有与mysqld的交互必须使用命名管道或共享内存(在Windows上)或Unixsocket文件(在Unix上)。强烈建议对只允许本地客户端的系统使用此选项。
来源
但是为了安全性,我并不想把这个选择给移除,难道只好忍痛不用ORM了吗?
因为看了文档,mysql这个连接库是可以使用socketPath这个属性指定Unix套接字文件,但是Sequelize.js没发现有关属性。
最后只好发issue,不久就有dalao回答说可以用dialectOptions设置mysql的属性。
下面是测试成功的代码:
importSequelizefrom'sequelize'; letsequelize=newSequelize('database','username','password',{ host:'localhost', port:3306, dialect:'mysql', dialectOptions:{ socketPath:'/tmp/mysql.sock'//指定套接字文件路径 } pool:{ max:5, min:0, idle:10000 } });
就是这么简单…
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。