Node.js MySQL error: ECONNREFUSED только иногда - PullRequest
0 голосов
/ 01 июня 2018

Я прочитал много похожих вопросов, таких как ошибка 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

Существует ли причина, по которой этот конкретный сценарий не сможет подключиться к базе данных?

1 Ответ

0 голосов
/ 01 июня 2018

Неудачная попытка подключения 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' является пользователем , отличным от '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 Serverзапускается без опции --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 Server.Это больше похоже на то, что в сетевом соединении было отказано, еще до того, как мы добрались до MySQL Server.

Если бы MySQL-сервер не разрешал доступ, мы ожидали бы получить такую ​​ошибку от MySQL Server:

ERROR 1045 (28000): Access denied for user 'root'@'hostname' (using password: YES)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...