Не удается получить доступ к базе данных mysql из приложения узла экспресс - PullRequest
0 голосов
/ 08 мая 2019

Я знаю, что на этот вопрос было дано много ответов, но, похоже, никто из них не помог мне в этой проблеме. Я хочу создать клиентское приложение create-Reaction-app, экспресс-бэкэнд и базу данных mysql с помощью docker-compose. Я настроил свой файл, который, кажется, раскручивает все мои контейнеры на портах Givens. Моя проблема в том, что когда я пытаюсь получить доступ к своей базе данных с помощью пакета npm mysql, я получаю ошибку ECONNREFUSED. Я знаю, что могу подключиться к базе данных из приложения узла, так как когда я создаю отдельное приложение узла, которое не находится в контейнере Docker, оно работает нормально.

Почему я могу получить доступ к моей базе данных MySQL в Docker-контейнере из Sequel Pro и из другого приложения, не являющегося узлом Docker, но не тогда, когда я запускаю их все с помощью docker-compose.

Вот ссылка на мой файл docker-compose здесь. https://github.com/Jazilch/airbnb-app/blob/master/docker-compose.yml

enter image description here

Я удалил имя пользователя и пароль, так как знаю, что они верны, поскольку я могу подключиться, используя то же имя пользователя и пароль, с моего сервера другого узла, который использует ту же конфигурацию.

const pool = mysql.createPool({
  host: 'localhost',
  port: '3306',
  user: '',
  password: '',
  database: 'airbnb_database',
});

pool.query = util.promisify(pool.query);

pool.getConnection((err, connection) => {
  if (err) {
      if (err.code === 'PROTOCOL_CONNECTION_LOST') {
          console.error('Database connection was closed.')
      }
      if (err.code === 'ER_CON_COUNT_ERROR') {
          console.error('Database has too many connections.')
      }
      if (err.code === 'ECONNREFUSED') {
          console.error('Database connection was refused.')
      }
      if (err) {
          console.log(err);
      }
  }
  if (connection) connection.release()
  return
})

1 Ответ

1 голос
/ 08 мая 2019

Вам необходимо заменить localhost на имя контейнера базы данных.Я предлагаю вам добавить более приятные имена с container_name в ваш docker-compose.yml и использовать это имя.

Например, для службы mysql:

   container_name: mysql

и в вашем скрипте:

const pool = mysql.createPool({
  host: 'mysql',
  port: '3306',
  user: '',
  password: '',
  database: 'airbnb_database',
});

У вас также есть ошибка в вашем docker-compose.yml, где база данных находится в сети, отличной от 'api'.Таким образом, они никогда не увидят друг друга.Чтобы исправить, служба mysqldb должна выглядеть так:

  mysqldb:
    image: mysql:5.6
    container_name: mysql
    restart: always
    ports:
     - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
    networks:
      - webappnetwork
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...