Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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
NodeJS和Sequelize可以';t在docker compose中连接到MySQL_Mysql_Node.js_Docker_Docker Compose_Sequelize.js - Fatal编程技术网

NodeJS和Sequelize可以';t在docker compose中连接到MySQL

NodeJS和Sequelize可以';t在docker compose中连接到MySQL,mysql,node.js,docker,docker-compose,sequelize.js,Mysql,Node.js,Docker,Docker Compose,Sequelize.js,我有一个非常类似的问题出现在这里: 但不幸的是,提议的解决方案不起作用。 我有一个带有Typescript(可能不相关)、Sequelize和MySQL数据库的NodeJS项目。 我已经建立了一个docker compose文件,其中包含一些脚本,这些脚本可以根据github的脚本对它们进行设置和旋转,从而对它们进行管理 script/setup只需为数据库创建卷并将其旋转: ... docker-compose down docker volume create --name=tournam

我有一个非常类似的问题出现在这里:

但不幸的是,提议的解决方案不起作用。 我有一个带有Typescript(可能不相关)、Sequelize和MySQL数据库的NodeJS项目。 我已经建立了一个docker compose文件,其中包含一些脚本,这些脚本可以根据github的脚本对它们进行设置和旋转,从而对它们进行管理

script/setup
只需为数据库创建卷并将其旋转:

...
docker-compose down
docker volume create --name=tournaments-data
docker-compose up -d tournaments-db
完成后,我运行
script/start
,它正在启动web应用程序:

...
docker-compose up web
所有容器都正确启动,我能够使用以下命令行成功地连接到MySQL容器:
MySQL-uroot-p-h127.0.0.1-p3307--protocol=tcp
,还可以使用JetBrains Datagrip

NodeJS应用程序似乎无法正确连接到mysql数据库,因为我遇到以下错误:

Unable to connect to the database: ConnectionRefusedError [SequelizeConnectionRefusedError]: connect ECONNREFUSED 127.0.0.1:3306

我尝试从所有IP(而不仅仅是本地主机)授予root访问权限,但这也不起作用。 我还认为docker compose存在网络问题,所以我验证了他们在同一个网络上(他们是),还尝试通过docker compose为他们创建一个不同的网络,但也不起作用

有人知道可能遗漏了什么吗?由于我可以从外部连接到mysql实例,我假设我缺少一些配置或类似的配置,但是在查看了许多建议的解决方案之后,这些都是无效的

另外,由于业务限制,MySQL版本被锁定,因此我无法升级/使用其他版本

Sequelize返回完整的错误消息:

web_1             | [Node] Unable to connect to the database: ConnectionRefusedError [SequelizeConnectionRefusedError]: connect ECONNREFUSED 127.0.0.1:3306
web_1             | [Node]     at /usr/src/app/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:123:19
web_1             | [Node]     at tryCatcher (/usr/src/app/node_modules/bluebird/js/release/util.js:16:23)
web_1             | [Node]     at Promise._settlePromiseFromHandler (/usr/src/app/node_modules/bluebird/js/release/promise.js:547:31)
web_1             | [Node]     at Promise._settlePromise (/usr/src/app/node_modules/bluebird/js/release/promise.js:604:18)
web_1             | [Node]     at Promise._settlePromise0 (/usr/src/app/node_modules/bluebird/js/release/promise.js:649:10)
web_1             | [Node]     at Promise._settlePromises (/usr/src/app/node_modules/bluebird/js/release/promise.js:725:18)
web_1             | [Node]     at _drainQueueStep (/usr/src/app/node_modules/bluebird/js/release/async.js:93:12)
web_1             | [Node]     at _drainQueue (/usr/src/app/node_modules/bluebird/js/release/async.js:86:9)
web_1             | [Node]     at Async._drainQueues (/usr/src/app/node_modules/bluebird/js/release/async.js:102:5)
web_1             | [Node]     at Immediate._onImmediate (/usr/src/app/node_modules/bluebird/js/release/async.js:15:14)
web_1             | [Node]     at processImmediate (internal/timers.js:439:21) {
web_1             | [Node]   name: 'SequelizeConnectionRefusedError',
web_1             | [Node]   parent: Error: connect ECONNREFUSED 127.0.0.1:3306
web_1             | [Node]       at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1134:16) {
web_1             | [Node]     errno: 'ECONNREFUSED',
web_1             | [Node]     code: 'ECONNREFUSED',
web_1             | [Node]     syscall: 'connect',
web_1             | [Node]     address: '127.0.0.1',
web_1             | [Node]     port: 3306,
web_1             | [Node]     fatal: true
web_1             | [Node]   },
web_1             | [Node]   original: Error: connect ECONNREFUSED 127.0.0.1:3306
web_1             | [Node]       at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1134:16) {
web_1             | [Node]     errno: 'ECONNREFUSED',
web_1             | [Node]     code: 'ECONNREFUSED',
web_1             | [Node]     syscall: 'connect',
web_1             | [Node]     address: '127.0.0.1',
web_1             | [Node]     port: 3306,
web_1             | [Node]     fatal: true
web_1             | [Node]   }
web_1             | [Node] }

所以,我终于发现了问题所在。 我解决了一个问题,但导致了另一个问题。实际上,我创建的Sequelize实例没有通过主机+端口配置,因此它使用了默认配置,即
127.0.0.1:3306

基本上是这样的:

export const sequelize = new Sequelize({
  database: config.database,
  username: config.username,
  password: config.password,
  models: [path.join(__dirname, '/models')],
  dialect: config.dialect,
});
与此相反:

export const sequelize = new Sequelize({
  host: config.host,
  port: config.port,
  database: config.database,
  username: config.username,
  password: config.password,
  models: [path.join(__dirname, '/models')],
  dialect: config.dialect,
});


So config was correct, but I was just not using it properly in my code.

你能发布错误消息的完整堆栈吗?@Prabhjotsinghkaint编辑了帖子并添加了完整的输出。这是在NodeJS项目的初始加载时(该项目尝试对mysql数据库进行身份验证),数据库进程正在侦听端口3306,您需要将其用于容器间通信。无论是
暴露:
还是
端口:
都不会对此产生任何影响。您显示的配置与您引用的错误消息不匹配,因此可能还缺少一点连接。可能您需要重建映像,因为@DavidMaze表示错误与您的配置不同。您需要将congis中的端口更改为3307@DavidMaze甚至当所有端口都是
3306
时,@LinPy也会发生这种情况,即使将DB Config更改为
3307
也不起作用。此外,我还手动修剪了每个端口更改之间的容器、卷和网络,但仍然没有任何效果
export const sequelize = new Sequelize({
  database: config.database,
  username: config.username,
  password: config.password,
  models: [path.join(__dirname, '/models')],
  dialect: config.dialect,
});
export const sequelize = new Sequelize({
  host: config.host,
  port: config.port,
  database: config.database,
  username: config.username,
  password: config.password,
  models: [path.join(__dirname, '/models')],
  dialect: config.dialect,
});


So config was correct, but I was just not using it properly in my code.