[英]node.js mysql error: ECONNREFUSED
为什么我无法连接到mysql服务器?
在同一台服务器上运行 Apache/PHP 服务器并且它连接没有问题!?
var mysql_link = {
host : 'localhost',
port : 3308,
database: 'nodetest',
user : 'root',
password : 'xxx'
};
var connection = mysql.createConnection(mysql_link);
connection.connect(function(err){
console.log(err);
if(err != null){
response.write('Error connecting to mysql:' + err+'\n');
}
});
connection.end();
{ [Error: connect ECONNREFUSED]
code: 'ECONNREFUSED',
errno: 'ECONNREFUSED',
syscall: 'connect',
fatal: true }
root@dyntest-amd-6000-8gb /var/www/node/dyntest # ps ax | grep mysqld
7928 pts/0 S+ 0:00 grep mysqld
28942 ? S 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/run/mysqld/mysqld.pid
29800 ? Sl 17:31 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/var/lib/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/var/lib/mysql/mysql-error.log --open-files-limit=65535 --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
我知道这个问题已经得到解答,但对我来说问题是 mysql 服务器侦听 Unix 套接字而不是 tcp 套接字。 所以解决方案是添加:
port: '/var/run/mysqld/mysqld.sock'
到连接选项。
如果这以前有效,我的第一个猜测是您已经获得了在后台运行的 node.js 脚本的副本,该脚本持有连接。
我相信连接被拒绝是一条 tcp/ip 错误消息,而不是来自 MySQL 的消息,它表明它没有运行或正在另一个端口或套接字上运行。
你能试试 telnet 到 3308 端口吗? 查看服务器是否在该端口上运行?
telnet localhost 3308
你也可以试试:
mysql -hlocalhost -uroot -pxxx
概述
对于遇到此问题并正在运行mamp 的任何其他人。 我怀疑问题与网络有关,而不是MySQL
或Node.js
解决方案
如果打开MAMP
,并点击MySQL
左侧导航面板中就会拉起了MySQL选项页。 在页面中央,您会看到一个复选框,上面写着,
“允许网络访问
MySQL
”。
选中此框,然后重新启动您的MAMP
。 此时,您现在可以使用telnet
或node.js
脚本测试与 MySQL 的连接。
暗示
请记住,您可以通过打开MAMP
并单击左侧导航面板上的端口链接来检查您的MySQL
正在哪个port
上运行。
视觉辅助
由于一些非常奇怪的原因,我的计算机只允许我将端口 3306 作为我的连接的默认端口,以使其正常工作。
我想在这里评论我的解决方案,以防万一数据库中有像我这样的新手。
我收到这个错误是因为我已经正确安装了mysql
NPM 包,但我没有在我的计算机上安装任何 MySQL 实现(我不知道我必须这样做)。
我使用的是 Arch Linux,因此,在我的项目中已经安装了 NPM 包的情况下,我执行了pacman -Syu mariadb
(MariaDB 是 Arch Linux 中 MySQL 的默认实现),然后按照指南对其进行配置。
然后,您可以使用刚刚配置的root
用户或创建一个新用户以在您的项目中使用。 对于后者:
通过运行mysql -u root -p
进入mysql
CLI。
输入root
用户的密码。
使用CREATE DATABASE mydatabase;
创建一个新数据库CREATE DATABASE mydatabase;
.
使用CREATE USER test IDENTIFIED BY "testpass";
创建一个新用户CREATE USER test IDENTIFIED BY "testpass";
.
授予test
用户使用新数据库的权限,并GRANT ALL PRIVILEGES ON mydatabase.* TO test@localhost IDENTIFIED BY "testpass";
授予所有权限GRANT ALL PRIVILEGES ON mydatabase.* TO test@localhost IDENTIFIED BY "testpass";
. 有关这方面的更多信息,请参阅。
然后,在我的项目中,我会:
let connection = mysql.createConnection({
host: "localhost",
user: "test",
password: "testpass",
database: "mydatabase"
});
当我多次尝试连接和断开连接时,我也遇到了这个问题。 我通过结束连接并在连接关闭后运行服务器解决了这个问题,现在我可以毫无问题地连接了。
见下文 :
mysql.createConnection()
connection.end();
证明服务器运行良好后,删除connection.end()
重新运行服务器。
如果您使用 MAMP,请注意 mysql 默认 db_port 设置为 8889,因此您为此目的我必须将其更改为 3306(或您的应用程序 mysql db_port 设置为任何值)。
我的问题是节点服务器正在使用端口 3306 进行连接,所以它给出了下面的错误然后崩溃但 mysql 已启动并且似乎通过本地主机建立连接,尽管我无法测试它,因为节点服务器已关闭。
错误号:-61,代码:'ECONNREFUSED',系统调用:'connect',地址:'127.0.0.1',端口:3306,致命:true
一旦我将 MAMP mysql 上的端口从 8889 更改为 3306,节点服务器通过端口 3000 建立连接并给出以下语句:
服务器运行在端口 3000 解决方案是: 2
我使用 Windows 10 并且我有 Windows Subsystem For Linux (WSFL)。 我可以从 WSFL 控制台执行我的项目,但是我的 MySQL 安装在 Windows 中并且它们无法连接,但是当我从 Windows 控制台执行我的项目时,它可以正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.