无法从Node Express应用访问mysql数据库

时间:2019-05-08 15:21:16

标签: mysql node.js docker docker-compose

我知道这个问题已经得到了很多回答,但是他们似乎都没有帮助我解决这个问题。我想创建一个create-react-app客户端,使用docker-compose表达后端和mysql数据库。我已经配置了文件,似乎可以在给定端口上启动所有容器。我的问题是,当我尝试使用npm软件包mysql访问数据库时,出现ECONNREFUSED错误。我知道我可以从节点应用程序连接到数据库,因为当我创建不在Docker容器中的单独的节点应用程序时,它可以正常工作。

为什么我可以从Sequel Pro和另一个非docker节点应用访问我的docker容器mysql数据库,但是当我使用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 个答案:

答案 0 :(得分:1)

您需要使用数据库容器的名称更改localhost。我建议您在docker-compose.yml中使用container_name添加更好的名称,并使用该名称。

例如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