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
.
中轻松测试
我有一个将 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
.