簡體   English   中英

Node.js MySQL錯誤:有時僅ECONNREFUSED

[英]Node.js MySQL error: ECONNREFUSED only sometimes

我已經閱讀了許多類似的問題,例如node.js mysql錯誤: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

為什么有這個特定腳本無法連接到數據庫的原因?

失敗的是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地址或名稱。 您也可以使用--protocol=TCP選項顯式指定連接協議,即使是localhost也是如此。


也就是說,我們可以從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 Server中定義的用戶列表,我們可以執行如下查詢:

SELECT u.user
     , u.host
     , u.password
     , u.plugin
     , u.password_expired 
  FROM mysql.user u
 ORDER BY u.user, u.host

請注意,如果不使用--skip-name-resolve選項啟動MySQL Server,則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 Server得到的錯誤消息。 看起來更像是網絡連接被拒絕,甚至在我們進入MySQL Server之前。

如果MySQL服務器不允許訪問,我們期望從MySQL服務器收到這樣的錯誤:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM