Node.js MySQL - 错误:connect ECONNREFUSED

40

我使用Node.js作为服务器端。我在本地主机上测试了代码,一切都正常。我购买了一个服务器,并在其上安装了Apache和Node.js,然后在服务器上测试了我的Web应用程序。我将MySQL连接配置从localhost正确地更改为服务器配置。

我使用以下配置进行Web应用程序测试:

var mysql      = require('mysql');
var mysqlConnection;
function new_mysqlConnection() {
    mysqlConnection = mysql.createConnection({
      host     : 'myurl.at',
      user     : 'myusername',
      database : 'mydatabase',
      password : 'mypassword'
    });
}
我使用以下命令启动Node.js服务器:
$ node server.js

当我加载页面时,它会正确显示,但是当 Node.js 尝试连接到数据库时,我总是会得到以下错误:

Error: connect ECONNREFUSED
    at errnoException (net.js:905:11)
    at Object.afterConnect [as oncomplete] (net.js:896:19)
    --------------------
    at Protocol._enqueue (/var/www/node_modules/mysql/lib/protocol/Protocol.js:135:48)
    at Protocol.handshake (/var/www/node_modules/mysql/lib/protocol/Protocol.js:52:41)
    at Connection.connect (/var/www/node_modules/mysql/lib/Connection.js:119:18)
    at reconnectDb (/var/www/server.js:319:18)
    at app.get.email (/var/www/server.js:109:2)
    at Layer.handle [as handle_request] (/var/www/node_modules/express/lib/router/layer.js:82:5)
    at trim_prefix (/var/www/node_modules/express/lib/router/index.js:302:13)
    at /var/www/node_modules/express/lib/router/index.js:270:7
    at Function.proto.process_params (/var/www/node_modules/express/lib/router/index.js:321:12)
    at next (/var/www/node_modules/express/lib/router/index.js:261:10)

1
要么你的主机名不正确,要么你需要指定一个端口号。你的mysqld运行在哪个端口上?解决了这个问题之后,另一个可能性是你的主机端口被阻止了。你是通过什么类型的网络连接的?通常我们会通过本地主机或内部网络连接,而不是互联网。 - beiller
@beiller 首先,我要感谢您的快速回答。我已经尝试在配置中设置端口,但仍然无法工作。Mysql运行在此端口上: tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 4322/mysqld 我的server.js正在2000端口上运行,这两个应该在同一个端口上运行吗?您说的“您连接的是什么类型的网络?”是什么意思?谢谢! - Nico
不,它们不在同一端口运行。你的错误信息基本上意味着“操作系统拒绝了你的连接”,也就是说你根本没有接近 mysql 服务器。通过问网络的问题,我想知道,mysql 和你的 Node.js 应用程序是否在同一台物理服务器上运行? - beiller
是的,mysql和node.js运行在同一台物理服务器上,但我已经解决了这个问题。我必须在mysql连接配置中添加socketPath,像这样: socketPath: '/var/run/mysqld/mysqld.sock'但还是谢谢你的时间! :) - Nico
请在此帖子中检查我的答案 https://dev59.com/xV0a5IYBdhLWcg3wfIt-#37563064 - harishannam
显示剩余3条评论
21个回答

62
我遇到了同样的问题,但我通过更改解决了这个问题。
host:  'localhost'

host:   '127.0.0.1'

8
没问题。我翻译一下:这个有效了。我只是想知道可能的解释是什么?我知道 localhost 的 IP 是 127.0.0.1。 - Stanley
非常简单 :) 谢谢 - elgsylvain85
1
谢谢,这对我有用,因为我通过nvm运行了node 19,尽管在使用node 16时连接了,但它并没有连接。 - Arham S C

54
你需要将socket path的值添加到配置对象中:
socketPath: '/var/run/mysqld/mysqld.sock'

使用 MAMP,您可以打开 http://localhost:8888/MAMP,然后找到:

/Applications/MAMP/tmp/mysql/mysql.sock

最后你会有:

var connection = mysql.createConnection({
  host     : config.host,
  user     : config.user,
  password : config.pass,
  database : config.db,
  socketPath: '/Applications/MAMP/tmp/mysql/mysql.sock'
});

1
这个解决了我的问题!我已经苦恼了两天..非常感谢! - 4UmNinja
1
运行得非常好。之前文件是空的,所以我添加了这些代码行,现在正常工作!非常感谢你。 - Sulokit
1
它为我节省了一整天的沮丧,有趣的是在 MacOS 上它不是必需的,但在 Ubuntu 上使用相同的 express.js 配置会导致断开连接而没有 socketPath。 - Sebastian

23

检查服务器上的MySQL端口。

在MAMP中,默认使用8889端口。

将其添加到连接配置中。

您的MySQL配置应该如下所示。

this.pool = mysql.createPool({
  connectionLimit: 10,
  host: 'localhost',
  user: 'root',
  password: 'root',
  database: 'todo',
  port: '8889'
});

5

检查您的XAMPP服务器是否正在运行MySQL


3

经过两天的挣扎,我用下面的代码解决了问题。(只提供我的解决方案,你可能有其他的解决方案。)

也要按照以下步骤进行操作:

  1. 删除所有的node_modules文件夹
  2. 运行“npm audit --force”命令
  3. 使用“npm install”命令安装npm包

const sequelize = new Sequelize("test", "root", "root", { host: "127.0.0.1", dialect: "mysql", port: "8889", connectionLimit: 10, socketPath: "/Applications/MAMP/tmp/mysql/mysql.sock" });

注:我正在使用sequelize和graphql(NODEJS)。


3
关于本地主机(localhost)与127.0.0.1的问题(我没有足够的声望来添加评论 :-( )- https://dev59.com/xV0a5IYBdhLWcg3wfIt-#53533120 我遇到了同样的问题,我使用host: "localhost",通过使用"127.0.0.1"解决了它。
我一直收到错误信息Error: connect ECONNREFUSED ::1:3306 - 最终我意识到它报告的是IPv6本地地址。尽管我已经在MySQL用户中定义了@'%'和@'localhost',但看起来MySQL不喜欢IPv6本地地址 - 可能与我的MySQL设置有关。

这并没有真正回答问题。如果你有其他问题,可以点击提问来提出。如果你想在这个问题有新的回答时收到通知,你可以关注此问题。一旦你拥有足够的声望,你还可以添加悬赏以吸引更多关注。- 来自评论 - Yogendra
您绝对是正确的,这并没有回答原始问题,但它确实为我所引用的帖子中提出的问题提供了一些线索。祝好! - Pete

3
如果使用express和MySQL,端口应该与您的MySQL端口相同。默认的MySQL端口是3306
let defaultPORT = 3306;
var express = require('express');
var app = express();
var mysql  = require('mysql');
var connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'yourMYSQLUser',
    password : 'yourMYSQLPassword'
});
connection.connect();
 
connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
    if (error) throw error;
    console.log('The solution is: ', results[0].solution);
});

var server = app.listen( defaultPORT, function() {
    console.log( defaultPORT)
});

1
在我的情况下,我下载了XAMPP并检查了我的用户名和密码,最终它终于起作用了。
XAMPP > mySQL连接 > phpmyadmin > 用户账户:查看您的账户详情!
希望这可以帮到您。

1

我遇到了同样的问题,原来是mysql没有运行。请通过以下方式确保它正在运行:

$ systemctl status mysqld

如果您看到这个:

● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: failed (Result: start-limit) since Tue 2020-08-18 12:12:29 CDT; 32min ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 18668 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS (code=exited, status=2)
  Process: 18650 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 18668 (code=exited, status=2)
   Status: "SERVER_BOOTING"

如果服务没有运行,运行以下命令来启动:

$ systemctl start mysqld


1
在大多数情况下,您的主机应该与MySQL配置文件中的bind-address匹配。 如果您的bind-address是0.0.0.0或127.0.0.1,则将主机设置为“localhost”应该可以正常工作。但是,如果您的bind-address是实际的IP地址,则应添加您的IP地址。
var sql_con = mysql.createConnection({ 
host: "ip address",// should be the same as bind-address
user: "jeffery",
password: "damnthing",
database: "KOKATOOO"
});

谢谢你。我到处搜索如何修复这个错误,你的解决方案是唯一帮助我的。 - BarretV
@BarretV 很高兴我能帮到你! - janithcooray

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