我已阅读了许多类似的问题,例如node.js mysql error: ECONNREFUSED,但他们的解决方案都没有解决我的问题。例如,我在命令行上运行mysql -hlocalhost -P 3306 -p***
并正确连接到我的数据库。似乎问题是这个特定的脚本。我有另一个脚本与完全相同的dbconnection.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;
这适用于一个程序,但不适用于另一个程序。问题脚本的问题区域使用以下代码:
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
这个特定脚本无法连接到数据库是否有原因?
答案 0 :(得分:1)
失败的是TCP / IP连接尝试,成功的是使用本地unix套接字文件。
参考: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 -h 127.0.0.1 -P 3306 -p****
- 或 -
mysql -h localhost -P 3306 -p**** --protocol=TCP
MySQL通过user
和host
识别用户。
也就是说,'root'@'localhost'
是与<{1}}不同的用户。这些用户具有单独的密码,单独的权限等。
要获取MySQL Server中定义的用户列表,我们可以执行如下查询:
'root'@'%'
请注意,如果MySQL服务器在没有SELECT u.user
, u.host
, u.password
, u.plugin
, u.password_expired
FROM mysql.user u
ORDER BY u.user, u.host
选项的情况下启动,MySQL将反向查找IP地址到主机名。这意味着用户需要定义为--skip-name-resolve
而不是'user'@'db01.mydomain'
参考:https://dev.mysql.com/doc/refman/5.7/en/host-cache.html
如果这不是问题,那么可能是防止连接或SELinux / AppArmor配置的防火墙规则。
再次查看报告的错误消息
'user'@'127.0.0.1'
这看起来不像我们期望的MySQL服务器的错误消息。在我们进入MySQL服务器之前,看起来更像网络连接被拒绝了。
如果MySQL服务器不允许访问,我们希望从MySQL服务器收到这样的错误:
Error: connect ECONNREFUSED 127.0.0.1:3306