Node.js中使用MySQL时出现connect ECONNREFUSED 127.0.0.1:3306报错如何解决,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
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?
解决问题
照例先谷歌,确实发现了很多人也遇到了这个问题,解决方法大概有这么几种:
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
}
});
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。