Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法从node express应用程序访问mysql数据库_Mysql_Node.js_Docker_Docker Compose - Fatal编程技术网

无法从node express应用程序访问mysql数据库

无法从node express应用程序访问mysql数据库,mysql,node.js,docker,docker-compose,Mysql,Node.js,Docker,Docker Compose,我知道这个问题已经得到了很多回答,但在这个问题上似乎没有一个能帮到我。我想用docker compose创建一个create react应用程序客户端、express后端和mysql数据库。我已经配置了我的文件,它似乎在givens端口上启动了我所有的容器。我的问题是,当我尝试使用npm包mysql访问我的数据库时,我得到了一个ECONNREFUSED错误。我知道我可以从节点应用程序连接到数据库,因为当我创建一个不在docker容器中的单独节点应用程序时,它可以正常工作 为什么我可以从Seque

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

为什么我可以从Sequel Pro和另一个非docker节点应用程序访问docker容器mysql数据库,但在我使用docker compose运行它们时却无法访问

这里有一个链接到我的docker compose文件

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

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

您需要使用数据库容器的名称更改
localhost
。我建议您在docker-compose.yml中使用
container\u 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

生成错误的代码在哪里?你到底是怎么联系的?该部分不在您的github中repository@Mihai我添加了一些额外的代码,说明如何连接到上面的数据库,这是有意义的。我在yml文件中添加了
container\u name
,但现在似乎出现了以下错误<代码>错误:getaddrinfo ENOTFOUND mysql:3306这很奇怪。。。。你能帮我一个忙,在api容器中打开一个shell并在其中运行“ping mysql”吗?你的意思是仅仅从我的api文件夹中,我的节点应用程序应该在那里运行。看起来我得到了以下
ping:无法解析mysql:未知主机
。我明白了,对不起。我不得不克隆这个项目并自己运行。创建网络并将api容器附加到该网络。但是您没有附加mysql容器。他们需要在同一个网络上!要么将该网络全部删除,要么将mysql容器也放在同一网络上。@JamesZilch我也用这个发现更新了解决方案