Node.js MySQL错误:有时只能ECONNREFUSED

时间:2018-06-01 16:24:59

标签: mysql node.js express

我已阅读了许多类似的问题,例如node.js mysql error: ECONNREFUSED,但他们的解决方案都没有解决我的问题。例如,我在命令行上运行mysql -hlocalhost -P 3306 -p***并正确连接到我的数据库。似乎问题是这个特定的脚本。我有另一个脚本与完全相同的dbconnection.js文件,它连接得很好,就像命令行一样。

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;

这适用于一个程序,但不适用于另一个程序。问题脚本的问题区域使用以下代码:

Notifications.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 个答案:

答案 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通过userhost识别用户。

也就是说,'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