node.js mysql错误:econnrefused只是有时

wnavrhmk  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(401)

我读过很多类似的问题,比如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 这个特定的脚本为什么不能连接到数据库?

isr3a4wc

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 -h 127.0.0.1 -P 3306 -p****

-或者-

mysql -h localhost -P 3306 -p****--protocol=TCP

mysql通过两种方式标识用户 user 以及 host .
也就是说, 'root'@'localhost' 与其他用户不同 'root'@'%' . 这些用户有单独的密码、权限等。
要获取mysql server中定义的用户列表,我们可以执行如下查询:

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 server不允许访问,我们可能会从mysql server得到如下错误:

ERROR 1045 (28000): Access denied for user 'root'@'hostname' (using password: YES)

相关问题