SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:4321

SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:4321

我正在将 Sequelize ORM 与托管在 docker 容器 运行 本地主机上的 PostgreSQL 方言一起使用。该应用程序 运行 通过端口 3050 连接,数据库通过端口 5432 重定向到 4321。

错误:

Server is running on port: 3050
Unable to connect to the database: SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:4321

docker-compose.yml

version: "3"

services:
  app:
    build: .
    command: yarn start
    ports:
      - "3050:3050"
    depends_on:
      - postgres
    volumes:
      - .:/home/app/medtech
      - /home/app/medtech/node_modules
  postgres:
    image: postgres:alpine
    ports:
      - "4321:5432"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_DB: medtech_dev
      POSTGRES_PASSWORD: uaz0ZWrsCeUG3271GsRB

我的数据库连接片段

import Sequelize from 'sequelize';
import Constants from '../utils/constants';

const sequelize = new Sequelize(
  Constants.database.name,
  Constants.database.user,
  Constants.database.password, {
    host: Constants.database.host,
    port: Constants.database.port,
    dialect: 'postgres',
    pool: {
      max: 10,
      min: 0,
      acquire: 10000,
      idle: 20000,
    },
    timezone: Constants.timezone,
  },
);

常量值来自我的 .env:

DATABASE_PORT=4321
DATABASE_HOST=localhost
DATABASE_NAME=medtech_dev
DATABASE_USER=postgres
DATABASE_PASSWORD=uaz0ZWrsCeUG3271GsRB

出于某种我不知道的原因 我正在使用一个单独的文件 运行 我的种子和迁移使用完全相同的数据库常量和 有效。这里是:

const Constants = require('../utils/constants').default;

module.exports = {
  username: Constants.database.user,
  port: Constants.database.port,
  password: Constants.database.password,
  database: Constants.database.name,
  host: Constants.database.host,
  dialect: 'postgres',
};

在我通过我的文件和我阅读的许多主题进行了许多更改之后,我想不出是什么导致了这个问题。这是我第一次使用 Docker,我不知道我的 Docker 配置文件是否真的有问题或其他错误。

感谢任何帮助。

您的应用程序容器和 postgres 运行 在两个不同的容器中,这意味着它们是两台不同的机器,每台机器都有自己的 ip。

您无法使用 localhost:postgresport 从您的应用程序容器调用 postgres 服务,反之亦然,从 postgres 到应用程序容器

似乎 Constants.database.host 是 localhost 或 172.0.0.1 ,要到达 postgres 容器,您必须调用容器 ip 或名称或服务名称

在您的情况下,将 Constants.database.host 值更改为 postgres 并试一试