Express + Sequelize:在连接时挂起应用程序

Express + Sequelize: hanging the app on connection

我有一个将 postgres 作为 db、sequelize 和 express 的应用程序,每当它收到一个 db 查询时,它就永远留在那里,没有日志记录或任​​何东西 我 运行 postgres 在我可以通过 GUI 正常连接的容器中 当我将它换成 sqlite 时,它​​完美地运行了应用程序

这里是相关的一段代码

const databaseURL =
  process.env.DATABASE_URL ||
  "postgres://postgres:postgres@0.0.0.0:5432/postgres";
console.log(databaseURL)
const db = new Sequelize(databaseURL, { logging: console.log });

在 docker 撰写

dc ps            
       Name                     Command              State                    Ports                  
-----------------------------------------------------------------------------------------------------
baity-backend_db_1   docker-entrypoint.sh postgres   Up      0.0.0.0:5432->5432/tcp,:::5432->5432/tcp

日志

> DEBUG=express:* node index.js

  express:application set "x-powered-by" to true +0ms
  express:application set "etag" to 'weak' +1ms
  express:application set "etag fn" to [Function: generateETag] +1ms
  express:application set "env" to 'development' +0ms
  express:application set "query parser" to 'extended' +1ms
  express:application set "query parser fn" to [Function: parseExtendedQueryString] +0ms
  express:application set "subdomain offset" to 2 +0ms
  express:application set "trust proxy" to false +0ms
  express:application set "trust proxy fn" to [Function: trustNone] +0ms
  express:application booting in development mode +0ms
  express:application set "view" to [Function: View] +0ms
  express:application set "views" to '/home/omar/workspace/js/baity-backend/views' +0ms
  express:application set "jsonp callback name" to 'callback' +0ms
postgres://postgres:postgres@0.0.0.0:5432/postgres

更新 1:

version: "3.9"

services:
  web:
    build:
      dockerfile: Dockerfile
      context: ./frontend
    env_file:
      - ./frontend/.env
    ports:
      - "8080:8080"
      - "3000:3000"
    stdin_open: true
    volumes:
      - ./frontend:/opt/web
  app:
    build: .
    ports:
      - "4000:4000"
    volumes:
        - .:/code
        - /code/node_modules
    restart: always
    command: npm start
    env_file:
      - .env
    links:
      - db
  db:
    image: postgres:11.14-bullseye
    ports:
      - "5432:5432"
    env_file:
      - .env
    volumes:
      - ./.data/db:/var/lib/postgresql/data

FROM node:14.18.2-bullseye

WORKDIR /code

COPY package*.json ./
RUN npm install -g nodemon
RUN npm install

COPY . .

Package.json

{
  "name": "server",
  "version": "1.0.0",
  "description": "Node based server for real eastate website",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "xxx <xxx@gmail.com>",
  "license": "ISC",
  "dependencies": {
    "axios": "^0.19.2",
    "bcrypt": "^4.0.1",
    "cloudinary": "^1.20.0",
    "cors": "^2.8.5",
    "dotenv": "^8.2.0",
    "express": "^4.17.1",
    "express-form-data": "^2.0.12",
    "express-formidable": "^1.2.0",
    "jsonwebtoken": "^8.5.1",
    "multer": "^1.4.4",
    "node-cron": "^2.0.3",
    "pg": "^7.18.2",
    "sequelize": "^5.21.5",
    "sequelize-auto-migrations": "^1.0.3",
    "sqlite3": "^5.0.2",
    "stripe": "^8.35.0"
  }
}

节点:14.18.2

DATABASE_URL=postgres://postgres:postgres@db:5432/postgres

我认为是你的“0.0.0.0:5432”。

如果是本地的,它应该只是“localhost:5432”。 如果部署的服务器是远程的,它应该是某个IP地址XXX.XXX.XXX.XXX:5432。 如果部署的服务器是家庭网络,它应该是“192.168.0.XXX:5432”.

检查您的 postgres 网络配置 https://youtu.be/Erqp4C3Y3Ds

在 node.js 容器中尝试连接到数据库时,它将尝试在没有 Postgres 运行 的端口 5432 上连接到自身“0.0.0.0”。假设您有一个用于 nodejs 后端应用程序的容器,以及一个用于数据库的 postgres 实例。 您需要引导 Postgres 实例所在的 nodejs 容器。

您需要将主机 "0.0.0.0:5432" 更改为您的 docker-name

对于您的情况,您可以更改该变量 databaseURL 或设置变量 DATABASE_URL 到“postgresql://postgres:postgres@your_machine_ip:5432/postgres

当您使用 docker-compose:

services:
  postgres:
    container_name: app-database
    network: postgres
    image: postgres
    ...

  express:
    container_name: app-backend
    network: postgres
    environment:
      DATABASE_URL: "postgresql://postgres:postgres@app-database:5432/postgres"

  networks:
    postgres:
      driver: bridge

    ...

如您所见,DATABASE_URL 将使用“app-database”,这是 postgres 容器的名称。

快速测试后:根据您发布的 package.json - 您使用的 pg 模块版本与 Node.Js 14.

不兼容

有关更多上下文,请参阅 this issue

解决方法是:确保你是运行最新的pg版本。

例如纱线:

yarn add pg@"8.7.1"

如果出于任何原因无法做到这一点 - 降级到 Node 12 也应该可行。这可以在您的 Dockerfile.

中轻松测试