无法从NodeJs连接到MySQL,但它可以从服务器控制台工作

dzjeubhm  于 12个月前  发布在  Node.js
关注(0)|答案(1)|浏览(77)

我有一个NodeJs/express/Typescript应用程序,通过NGINX在Ubuntu 20.04服务器上运行。这些应用程序在端口4040上的子域www.example.com上运行api.mydomaon.com。
同一台服务器还在默认端口3306上托管我的MySQL数据库'myshop'。
我已经创建了一个mysql用户myuser@localhost,它对DB 'myshop'具有CRUD权限。
当我想通过控制台mysql -u myuser -h localhost -port=3306 -p与用户一起访问数据库时,我会得到一个密码提示,可以连接。
当我在我的NodeJs应用程序中使用相同的凭据时,我总是从NodeJs得到一个错误:connect ECONNREFUSED ::1:3306
这是我的快速连接代码:

const connectDetails = {
      host: process.env.DBHOST,
      user: process.env.DBUSER,
      password: process.env.DBPWD,
      database: "myshop",
      port: parseInt(process.env.DBPORT as string),
      debug: false,
    };

    console.log(connectDetails); // <-- this correctly shows me the settings. see below.

    this._connection = createPool(connectDetails);

当我启动应用程序时,它会显示我从上面的console.log连接尝试使用的设置。

{
  host: 'localhost',
  user: 'myuser',
  password: 'mypassword',
  database: 'myshop',
  port: 3306,
  debug: true
}

在启动时,我没有得到一个错误。
当我尝试使用this._connection在我的数据库上执行查询时,就会出现这个错误。喜欢:this._connection.execute(query, values, (err, results) => { ... }
我试图重新启动数据库,删除并重新创建用户,提供一个套接字路径,并在网络上红了几个小时。
我会非常感谢那些指向有效解决方案的提示

kqlmhetl

kqlmhetl1#

多亏了@ Yellow Dragon的提示,我才能找到它。
我不得不调整两件事:

1. localhost到127.0.0.1

不知何故,NodeJs想要IP而不是字符串'localhost'。标签:ECONNREFUSED error with node.js that does not occur in other clients

2.修改mysql认证插件

显然MySQL 8正在使用一个新的默认插件进行身份验证:caching_sha2_password而不是mysql_native_password
最新的node-mysql 2包版本还不支持新的默认插件。看这篇文章:Node.js can't authenticate to MySQL 8.0
有两种解决办法:

  • 更新node-mysql 2包

因为如果你来自未来,他们已经解决了这个问题。参见此处:https://github.com/sidorares/node-mysql2/issues/1248#issuecomment-1637257814

  • 更改mysql用户使用的auth插件

暂时直到你可以得到一个node-mysql 2包版本,可以处理新的认证插件
ALTER USER 'myuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mypassword';

相关问题