我有一个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) => { ... }
我试图重新启动数据库,删除并重新创建用户,提供一个套接字路径,并在网络上红了几个小时。
我会非常感谢那些指向有效解决方案的提示
1条答案
按热度按时间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
有两种解决办法:
因为如果你来自未来,他们已经解决了这个问题。参见此处:https://github.com/sidorares/node-mysql2/issues/1248#issuecomment-1637257814
暂时直到你可以得到一个node-mysql 2包版本,可以处理新的认证插件
ALTER USER 'myuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mypassword';