Node.js+;MySQL:程序拒绝使用“连接到远程数据库”;“经济融合”;

Node.js+;MySQL:程序拒绝使用“连接到远程数据库”;“经济融合”;,mysql,node.js,discord.js,ubuntu-18.04,linode,Mysql,Node.js,Discord.js,Ubuntu 18.04,Linode,我想出了下面的解决方案。我留下了第二个更新,以便进一步澄清。 上下文 我有一个Discord机器人,使用Discord.js库用JavaScript编写,我自己已经做了将近两年。一年多前,我开始使用MySQL进行数据库查询等。这是在我本地的Windows 10计算机上。因为这在当时只是一个小爱好项目,所以我并不太担心开发和生产都只有一个MySQL实例。最后,大约9个月前,我终于能够在运行Ubuntu18.04的Linode服务器上启动并运行bot,并在那里运行MySQL数据库的副本 到目前为止,

我想出了下面的解决方案。我留下了第二个更新,以便进一步澄清。

上下文 我有一个Discord机器人,使用Discord.js库用JavaScript编写,我自己已经做了将近两年。一年多前,我开始使用MySQL进行数据库查询等。这是在我本地的Windows 10计算机上。因为这在当时只是一个小爱好项目,所以我并不太担心开发和生产都只有一个MySQL实例。最后,大约9个月前,我终于能够在运行Ubuntu18.04的Linode服务器上启动并运行bot,并在那里运行MySQL数据库的副本

到目前为止,通过这种设置,一切都进展顺利。我使用Windows PC上的本地数据库进行开发和测试,然后将更新推送到Linode上的Ubuntu18.04服务器,生产数据库就在那里。此外,为了以防万一,在进行开发时,我确实会在我的PC上本地运行bot。有两个Discord机器人,它们有两个唯一的令牌(一个用于生产,一个用于开发),这样我就可以在更新时保持生产一个运行。我没有像生产机器人那样在服务器上全天候运行开发机器人

然而,最近,我的一个朋友(自称为“for loop杰出人士”)开始帮助我进行开发。因此,我们认为现在是一个让开发数据库全天候工作的好时机,这样无论我在不在,他都可以在bot上工作。这就是问题所在

问题 我在下面留下了一个更新,因为我切换到了
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
}
host
localhost
(显然)时,这种方法可以完美地工作,但当尝试远程连接到Linode上的服务器时,它只是拒绝了。我尝试了Linode URL(
example.com
)和IP(
Linode.IP.ADDRESS.HERE
)地址,都给出了相同的错误。我还知道Node的
mysql2
包存在,我只是还没有切换。如果切换实际上有助于解决这个问题,请让我知道

我尝试过的解决方案 我在这个网站上尝试了多个类似问题的答案,例如和,但是没有一个解决方案有效(包括添加
socketPath
或更改
端口
,等等)

我尝试将
mysqld.cnf
文件中的
bind address
更改为
0.0.0
*
,这两个文件都允许bot连接到数据库,但是仍然拒绝访问数据库本身。我所知道的是,它至少已连接(尽管现在再次尝试会给我留下一条错误消息)

MySQL是最新的,所以这可能与我没有使用mysql2有关吗?不管怎么说,我不是这个选项的粉丝,但我想至少我会尝试一下

我最后的办法是创建一个SSH隧道来连接数据库。再说一次,我还是一个web开发新手,所以我不完全知道我在做什么,但我遵循了,但替换了我需要的代码,最后出现了一个完全独立的SSH连接错误。如果SSH是绝对需要的,那么请告诉我,我会就此提出一个新问题。我只是想在这里提一下,以表明我至少已经尝试过了

更新 我已经切换到使用mysql2,虽然错误消息比较清晰,但仍然存在

我已经尝试过了,虽然现在我切换到
mysql2
,它并没有起到多大作用,但它确实让我更好地理解了MySQL的身份验证系统,这让我开始切换。不幸的是,Archil的回答和mysql2升级都给了我同样的错误:

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

不管怎样,我还是不喜欢这样做。如果有更安全的解决方案,我很乐意接受。现在我已经安装了
mysql2
,我将继续尝试不同的解决方案

更新2 在进一步研究之后,我发现权限并没有像我想象的那样为我试图连接到服务器的用户设置。一旦我修复了它,它就连接了,但是当bot启动时被查询的一个表显示为空。原来它根本不存在

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

我有答案

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

关于如何获得此解决方案,我留下了第二个更新

简言之,将
绑定地址
设置为
0.0.0.0
不起作用
  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
{
  code: 'ER_ACCESS_DENIED_ERROR',
  errno: 1045,
  sqlState: '28000',
  sqlMessage: "Access denied for user 'root'@'MY.LOCAL.IP.ADDRESS' (using password: YES)"
}
SHOW GRANTS FOR 'user'@'%';
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
service mysql restart