我读过很多类似的问题,比如node.js mysql error:econnreflused,但是他们的解决方案都没有解决我的问题。例如,我跑了 mysql -hlocalhost -P 3306 -p***
在命令行上,它正确地连接到我的数据库。看来问题出在这个特定的脚本上。我有另一个剧本和这个完全一样 dbconnection.js
文件和它的连接很好,就像命令行一样。
数据库连接.js
var mysql = require('mysql');
var connection = mysql.createPool ({
host: '127.0.0.1',
user: 'root',
password:****,
database: 'test_db',
dateStrings: true,
port: 3306
});
module.exports = connection;
这在一个程序中有效,但在另一个程序中无效。问题脚本的问题区域使用以下代码:
通知.js
var db = require('../dbconnection');
var express = require('express');
var router = express.Router();
router.post('/', function(req,res,next) {
handleNotification(req.body.value[0].resource);
res.status(202).end();
});
async function handleNotification(resource) {
db.query('SELECT of.name, po.PurchaseOrderID FROM order_files AS of \
INNER JOIN purchase_orders AS po ON po.PurchaseOrderID = of.purchaseOrderID \
INNER JOIN quotes ON po.PurchaseOrderID = quotes.PurchaseOrderID \
WHERE quotes.QuoteID=10000', function(err, rows) {
if (err) console.log(err);
else console.log(rows);
});
}
但我可以逃离bash, mysql -hlocalhost -P 3306 -p****
然后运行显示的精确查询并获得结果。我也可以从另一个脚本运行这个查询。
收到的错误如下: Error: connect ECONNREFUSED 127.0.0.1:3306
这个特定的脚本为什么不能连接到数据库?
1条答案
按热度按时间isr3a4wc1#
失败的是tcp/ip连接尝试,成功的是使用本地unix socketfile。
参考文献:https://dev.mysql.com/doc/refman/5.7/en/connecting.html
在unix上,mysql程序处理主机名
localhost
特别是,与其他基于网络的程序相比,这种方式可能不同于您所期望的。连接到localhost
,mysql程序尝试使用unix套接字文件连接到本地服务器。即使--port
或者-P
选项指定端口号。要确保客户端与本地服务器建立tcp/ip连接,请使用--host
或者-h
指定主机名值127.0.0.1
,或本地服务器的ip地址或名称。您还可以显式地指定连接协议,即使对于localhost
,通过使用--protocol=TCP
选项。也就是说,我们可以从mysql命令行客户机(拒绝连接)中获得相同的行为,尝试使用其中一个进行tcp/ip连接
-或者-
mysql通过两种方式标识用户
user
以及host
.也就是说,
'root'@'localhost'
与其他用户不同'root'@'%'
. 这些用户有单独的密码、权限等。要获取mysql server中定义的用户列表,我们可以执行如下查询:
请注意,如果启动mysql服务器时没有
--skip-name-resolve
选项,mysql将把ip地址反向查找到主机名中。这意味着用户需要被定义为'user'@'db01.mydomain'
而不是'user'@'127.0.0.1'
参考文献:https://dev.mysql.com/doc/refman/5.7/en/host-cache.html如果这不是问题所在,那么很可能是防火墙规则阻止了连接,或者是selinux/apparmor配置。
再次查看报告的错误消息,
这看起来不像我们期望从mysql服务器得到的错误消息。这看起来更像是网络连接被拒绝了,甚至在我们到达mysql服务器之前。
如果mysql server不允许访问,我们可能会从mysql server得到如下错误: