Node.js + MySQL:程序拒绝使用“ECONNREFUSED”

如何解决Node.js + MySQL:程序拒绝使用“ECONNREFUSED”

我想出了下面的解决方案。我已经留下了第二个更新以获得更多说明。

背景

我有一个 Discord 机器人,它是使用 discord.js 库用 JavaScript 编写的,我自己已经研究了近两年。一年多前,我开始使用 MySQL 进行数据库查询等。这是在我本地的 Windows 10 机器上。由于这在当时只是一个小型业余爱好项目,我并不太担心只有一个 MySQL 实例用于开发和生产。最后,大约 9 个月前,我能够在运行 Ubuntu 18.04 的 Linode 服务器上启动并运行机器人,以及在那里运行的 MySQL 数据库副本。

到目前为止,通过这种设置,一切都运行得很顺利。我使用 Windows PC 上的本地数据库进行开发和测试,然后将更新推送到生产数据库所在的 Linode 上的 Ubuntu 18.04 服务器。此外,为了以防万一这有帮助,我在进行开发时确实在我的 PC 上本地运行机器人。有两个 Discord 机器人带有两个独特的令牌(一个用于生产,一个用于开发),以便我可以在进行更新时保持生产中的一个运行。我没有像生产机器人那样在服务器上 24/7 全天候运行开发机器人。

然而,最近,我的一个朋友(自称为“for-loop extraordinaire”)开始帮助我进行开发。因此,我们认为现在也是让开发数据库 24/7 全天候活动的好时机,这样无论我在不在,他都可以在机器人上工作。这就是我们解决问题的地方。

问题

我在下面留下了更新,因为我已切换到 mysql2 软件包以尝试寻找解决方案。

所以,如果不是很明显,我的目标很简单:我希望我的机器人(在我或我朋友的 Windows 机器上使用 node.js 在本地运行时)连接到托管在其上的远程数据库我的 Ubuntu 18.04 服务器,在云端,而不是我的本地网络。我不害怕承认我远不是一个好的 Web 开发人员,所以我不知道这些东西是如何工作的后勤或来龙去脉。我能走到这一步真是个奇迹。但我认为它会像连接到本地 MySQL 实例一样简单。但是,当我运行代码时,控制台会向我吐出这个错误。

Error: connect ECONNREFUSED LINODE.IP.ADDRESS.HERE:3306
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1141:16)
    --------------------
    at Protocol._enqueue (D:\Users\path\node_modules\mysql\lib\protocol\Protocol.js:144:48)
    at Protocol.handshake (D:\Users\path\node_modules\mysql\lib\protocol\Protocol.js:51:23)
    at Connection.connect (D:\Users\path\node_modules\mysql\lib\Connection.js:119:18)
    at Object.<anonymous> (D:\Users\path\bot\index.js:118:5)
    at Module._compile (internal/modules/cjs/loader.js:1138:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1158:10)
    at Module.load (internal/modules/cjs/loader.js:986:32)
    at Function.Module._load (internal/modules/cjs/loader.js:879:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47 {
  errno: 'ECONNREFUSED',code: 'ECONNREFUSED',syscall: 'connect',address: 'LINODE.IP.ADDRESS.HERE',port: 3306,fatal: true
}

以下是我的代码的当前设置方式:

const mysql = require("mysql")
//CONNECT TO MYSQL
var con = mysql.createConnection({
    host: 'example.com',user: 'user',password: 'pass',database: 'botDB',charset: "utf8mb4"
});

//CONNECTED TO DATABASE
con.connect(err => {
    if (err) { throw err };
    console.log("My database is up and running!")
})

hostlocalhost(显然)时,此方法完美无缺,但当尝试远程连接到 Linode 上的服务器时,它只是拒绝。我试过 Linode URL (example.com) 和 IP (LINODE.IP.ADDRESS.HERE) 地址,都给我同样的错误。我也知道 Node 的 mysql2 包存在,我只是还没有切换。如果切换实际上有助于解决这个问题,请告诉我。

我尝试过的解决方案

我在本网站上尝试了多个类似问题的多个答案,例如 this onethis,但是没有一个解决方案有效(包括添加 socketPath 或更改 {{1 }} 等)

我已尝试将 port 文件中的 bind-address 更改为 mysqld.cnf0.0.0.0,这两者确实允许机器人连接到数据库,但是访问仍然被拒绝实际读取数据库本身。我所知道的是它至少已连接(尽管现在再次尝试给我留下了错误消息)

*

MySQL 是最新的,所以这与我不使用 code: 'ER_NOT_SUPPORTED_AUTH_MODE',errno: 1251,sqlMessage: 'Client does not support authentication protocol requested by server; consider upgrading MySQL client',sqlState: '08004',fatal: true 有关系吗?无论如何,我不喜欢这个选项,但我想我至少会尝试一下。

我最后的手段是创建一个 SSH 隧道来连接到数据库。再说一次,我仍然是一个 web 开发新手,所以我并不完全知道我在做什么,但我遵循了 this guide here,但是替换了我需要的代码,最终得到了一个完全独立的 SSH 连接错误.如果绝对需要 SSH 来完成我想要的,那么请告诉我,我将就此提出一个新问题。我只是想在这里提及它以表明我至少尝试过。

更新

我已改用 mysql2,虽然错误消息更清晰,但它仍然存在。

我尝试了 Archil's solution,虽然现在我已经切换到 mysql2,但它确实让我对 MySQL 的身份验证系统有了更好的了解,这让我受益匪浅首先切换。不幸的是,Archil 的回答和 mysql2 升级都给了我同样的错误:

mysql2

...尽管我已授予 { code: 'ER_ACCESS_DENIED_ERROR',errno: 1045,sqlState: '28000',sqlMessage: "Access denied for user 'root'@'MY.LOCAL.IP.ADDRESS' (using password: YES)" } 所有权限。

无论如何,这都不是我的首选方式。如果有更安全的解决方案,我会很乐意接受。既然我已经安装了 'root'@'%',我将继续尝试不同的解决方案。

更新 2

在进一步研究之后,我发现权限并没有像我想象的那样为我尝试连接到服务器的用户设置。一旦我解决了这个问题,它确实连接了,但是当机器人启动时被查询的表之一显示为空。原来它不存在!

我制作了一份生产数据库的副本,作为新开发数据库的基础。问题是,我的本地(旧)开发数据库中缺少 的表。这让我相信机器人正在与 MySQL 连接,但没有从数据库中读取任何内容。我添加了正确的表格,效果很好!我在下面留下了一个包含更具体步骤的解决方案,以防其他像我这样的新手 Web 开发人员找到此页面。感谢您的帮助!

解决方法

关于如何获得此解决方案,我已经进行了第二次更新。

简而言之,将 bind-address 设置为 0.0.0.0 确实有效。如果您使用原始的 mysql 软件包,则需要遵循 Archil's solution。如果您正在使用 mysql2 并且仍然有错误(或者如果 Archil 的回答不适用于 mysql),请确保您尝试连接的用户的 double-check the permissions使用:

SHOW GRANTS FOR 'user'@'%';

假设您像我一样尝试远程连接,如果您还没有,则需要使用“%”通配符创建一个用户。

此时它应该连​​接,就像对我一样,如果之后有任何错误,可能与数据库本身中的表有关。

,

我已经回答https://stackoverflow.com/a/50547109/4089212

请检查。 您需要更改 mySQL 的身份验证模式。

,

就我而言 (mariadb),我已设法将文件中的绑定地址更改为 0.0.0.0:

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

重新启动后,我设法连接到数据库:

service mysql restart

您可能需要在文件夹 /etc/mysql/mariadb.conf.d/

中搜索要编辑的正确文件

只需查找绑定地址(可能有一个像 127.0.0.1 这样的 IP 地址)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res