【问题标题】:Cannot access mysql database from node express app无法从 node express 应用程序访问 mysql 数据库
【发布时间】:2019-09-26 09:10:58
【问题描述】:

我知道这个问题已经得到了很多回答,但他们似乎都没有帮助我解决这个问题。我想用 docker-compose 创建一个 create-react-app 客户端、express 后端和 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

我删除了用户和密码,因为我知道它们是正确的,因为我可以从使用相同配置的其他节点服务器使用相同的用户名和密码进行连接。

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
})

【问题讨论】:

  • 产生错误的代码在哪里?你究竟想如何连接?该部分不在您的 github 存储库中
  • @Mihai 我添加了一些关于如何连接到上面的数据库的额外代码

标签: mysql node.js docker docker-compose


【解决方案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

【讨论】:

  • 这是有道理的。我将container_name 添加到我的 yml 文件中,但我现在似乎收到以下错误。 Error: getaddrinfo ENOTFOUND mysql mysql:3306prntscr.com/nm384b
  • 这很奇怪......你能帮我一个忙,在 api 容器中打开一个 shell 并在其中运行“ping mysql”吗?
  • 你的意思是从我的节点应用程序应该运行的 api 文件夹中。看起来我得到了以下ping: cannot resolve mysql: Unknown hostprntscr.com/nm3f1j
  • 对不起。我不得不克隆该项目并自己运行它。您创建一个网络并将 api 容器附加到该网络。但是您没有附加 mysql 容器。他们需要在同一个网络上!要么一起删除该网络,要么将 mysql 容器放在同一个网络上。
  • @JamesZilch 我也用这个发现更新了解决方案
猜你喜欢
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多