【问题标题】:Express + Sequelize: hanging the app on connectionExpress + Sequelize:在连接时挂起应用程序
【发布时间】:2022-01-16 03:06:20
【问题描述】:

我有一个使用 postgres 作为 db、sequelize 和 express 的应用程序,每当它收到一个 db 查询时,它就会永远停留在那里,没有日志记录或任​​何东西 我在一个可以通过 GUI 正常连接的容器中运行 postgres 当我将它换成 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 compose 上

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 . .

包.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

【问题讨论】:

  • 所有这些都在一个容器或不同的容器中,附加您的 Dockerfile 或 docker-compose。
  • 发布你的 package.json 文件和 Node.JS 版本
  • @madflow 完成 @ yassine 完成

标签: node.js postgresql docker sequelize.js


【解决方案1】:

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

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

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

【讨论】:

  • 我在本地,我可以使用相同的凭据连接 DBeaver,主机,通过我还创建了一个新容器并测试了与主机名 db(容器名称)的连接,但仍然失败
【解决方案2】:

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

您需要将主机"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 容器的名称。

【讨论】:

  • 用主机 db 完成了,仍然没有什么新东西
  • @OmarS。检查您是否使用了正确的网络驱动程序。我已将其包含在更新答案中。
  • 也试过了,但没有乐趣
【解决方案3】:

经过快速测试:根据您发布的 package.json - 您使用的 pg 模块和 Node.Js 14 版本不兼容。

请参阅this issue 了解更多上下文。

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

以纱线为例:

yarn add pg@"8.7.1"

如果由于任何原因无法做到这一点 - 降级到节点 12 也应该可以。这可以在您的Dockerfile 中轻松测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-31
    • 2012-01-19
    • 2014-09-12
    • 1970-01-01
    • 2012-04-12
    • 2013-09-29
    • 1970-01-01
    • 2013-09-15
    相关资源
    最近更新 更多