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

问题描述 投票:0回答:1

我读过许多类似的问题,比如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

这个特定脚本无法连接到数据库是否有原因?

mysql node.js express
1个回答
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''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服务器在没有--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配置的防火墙规则。

再次查看报告的错误消息,

Error: connect ECONNREFUSED 127.0.0.1:3306

这看起来不像我们期望的MySQL服务器的错误消息。在我们进入MySQL服务器之前,看起来更像网络连接被拒绝了。

如果MySQL服务器不允许访问,我们希望从MySQL服务器收到这样的错误:

ERROR 1045 (28000): Access denied for user 'root'@'hostname' (using password: YES)
© www.soinside.com 2019 - 2024. All rights reserved.