Node.js MySQL错误:ECONNREFUSED

20

为什么我无法连接到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

你能发布 ps ax | grep mysqld 命令的输出吗?我想看看 mysql 正在使用哪些标签。 - Pez Cuckow
2
--port=3306 vs. port : 3308,. 将脚本中的端口更改为3306,它应该可以工作。 - darthmaim
8个回答

44

我知道这个问题已经有了答案,但对我来说问题在于mysql服务器监听的是Unix套接字而不是tcp套接字。因此解决方法是添加:

port: '/var/run/mysqld/mysqld.sock'

到连接选项。


我在Ubuntu上测试了这个解决方案,它对我来说也比其他解决方案有效。 - kjh
8
对于OSX MAMP,端口是/Applications/MAMP/tmp/mysql/mysql.sock。 - windmaomao
2
只是为了未来的读者而发表意见:这解决了在Angstrom Distribution上通过node连接mysql的问题(至少对我在BeagleBoneBlack上是这样),路径实际上是/tmp/mysql.sock - rlemon
对于CentOS系统,端口号'/var/lib/mysql/mysql.sock'可以正常工作,谢谢。 - Hasan Veli Soyalan
谢谢!在Ubuntu 20.04上也可以工作。 - WebMarie
谢谢,@rlemon,Mac也是一样的。 - intumwa

13
如果这之前曾经起作用过,我第一个猜测是您已经有一个正在后台运行并持有连接的Node.js脚本副本。
我认为"Connection Refused"是一个TCP/IP错误信息,而不是来自MySQL,这表明它可能没有在运行,或者是在另一个端口或套接字上运行。
您可以尝试telnet到3308端口,看看服务器是否在该端口上运行?
telnet localhost 3308

你也可以尝试一下这个:

mysql -hlocalhost -uroot -pxxx

从命令行运行这个命令可以正常工作:mysql -hlocalhost -uroot -pxxx。如何杀死所有的node.js脚本?! - clarkk
抱歉, mysql -hlocalhost -P 3308 -uroot -pxxx 忘记了端口号,但是它可以工作。 - clarkk
现在尝试创建一个具有所有授权的'root'@'%'.. 仍然出现相同的错误.. 嗯.. - clarkk
1
嗯...我不知道为什么,但当我将端口更改为默认端口3306时,它可以工作!事实是,在PHP应用程序中它连接到端口3308,并且在my.cnf中也分配了端口3308... - clarkk
1
我猜PHP实际上正在使用套接字,而PHP配置中的3308是不正确的。 - Pez Cuckow

11

概览

如果其他人在使用 时遇到了此问题,我怀疑问题与网络有关,而不是与 MySQLNode.js 相关。

解决方案

如果您打开 MAMP 并在左侧导航面板中单击 MySQL,它将显示 MySQL 选项页面。在页面中间,您将看到一个复选框,上面写着:

"允许网络访问 MySQL"。

勾选此复选框,然后重新启动您的 MAMP。此时,您现在可以使用 telnetnode.js 脚本测试与 MySQL 的连接了。

提示

记得您可以通过打开 MAMP 并单击左侧导航面板上的端口链接来检查您的 MySQL 运行在哪个端口上。

可视化指南

在此输入图片描述


8

在我的 M1 MacBook Pro 上,通过 brew 安装 MySQL:

将主机从 'localhost' 更改为 '127.0.0.1' 并创建一个带有密码的不同用户解决了我的问题。 由于某种原因,我无法使用 root 用户和无密码连接到我的数据库。 我在 MySQL Workbench 上创建了新用户,但您也可以通过 mysql CLI 创建具有管理员权限的新用户。 只需搜索一下即可。

这是我的后端:

const express = require('express');
const mysql = require('mysql');
const app = express();
const port = 3500;

const db = mysql.createConnection({
    host: '127.0.0.1',
    user: 'admin',
    password: 'admin',
});
db.connect((err) => {
    if (err) throw err;
    console.log('connected to database');
});

app.listen(port, () => {
    console.log('server listening on port 3500');
});

4
谢谢!我只需要将“localhost”替换为“127.0.0.1”或“0.0.0.0”就可以让它工作了。 - Ahmad Tirmazi

3

出于某种奇怪的原因,我的计算机只允许我将端口3306作为默认端口进行连接以使其正常工作。

屏幕截图


不确定,但可能是因为您的 Apache Web 服务器没有运行。 - John'Sters
请不要将凭据存储在代码中。每当有人这样做,一只小企鹅就会受苦... - ozanmuyes

2

我想在这里评论我的解决方案,以防有像我一样的数据库新手。

我遇到了这个错误,因为我已经正确安装了mysql NPM包,但是我没有在我的电脑上安装任何MySQL实现(我不知道我需要安装)。

我使用的是Arch Linux,所以,在我的情况下,已经在我的项目中安装了NPM包,我执行了pacman -Syu mariadb(MariaDB是Arch Linux中的默认实现),然后按照指南进行配置。

然后,您可以使用刚刚配置的root用户或创建一个新用户在您的项目中使用。对于后者:

  • 通过运行mysql -u root -p进入mysql CLI。

  • 输入root用户的密码。

  • 创建一个新数据库,使用CREATE DATABASE mydatabase;命令。

  • 创建一个新用户,使用CREATE USER test IDENTIFIED BY "testpass";命令。

  • 授予test用户使用您的新数据库的权限,使用GRANT ALL PRIVILEGES ON mydatabase.* TO test@localhost IDENTIFIED BY "testpass";命令。更多信息请参见

然后,在我的项目中,我会有:

let connection = mysql.createConnection({
    host: "localhost",
    user: "test",
    password: "testpass",
    database: "mydatabase"
});

0

如果您正在使用MAMP,请注意mysql默认的db_port设置为8889,因此为了这个目的,我不得不将其更改为3306(或者您的应用程序mysql db_port设置为什么)。

我的问题是node服务器正在使用端口3306进行连接,因此它会给出下面的错误,然后崩溃,但是mysql已经启动并似乎通过localhost建立了连接,尽管我无法测试它,因为node服务器已经关闭了。

errno:-61, code:'ECONNREFUSED', syscall:'connect', address:'127.0.0.1', port:3306, fatal:true

一旦我将MAMP mysql上的端口从8889更改为3306,node服务器通过端口3000建立了连接,并给出了以下语句:

服务器运行在端口3000上 解决方案是:2


0

我使用的是Windows 10,并且安装了Windows子系统Linux(WSFL)。我可以从WSFL控制台执行我的项目,但是我的MySQL安装在Windows上,它们无法连接。然而,当我从Windows控制台执行我的项目时,它可以正常工作,没有任何问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接