繁体   English   中英

无法通过node/express连接到postgresql; postgresql 和运行在 docker 容器中的节点

[英]Unable to connect to postgresql through node/express; postgresql and node running in docker container

客户端(React)、服务器(Node)和数据库(postgres)都在 docker 容器中运行。 我正在使用 npm package 'pg' 创建池并通过 express 连接到 postgres 数据库。 但是,我无法连接。 无法运行任何查询。

但是我可以通过本地机器上的 pgAdmin 连接相同的 postgres 图像。 通过连接到端口 5435。

我是 docker 的新手,我什么也想不通。 帮助。

docker-compose.yml

version: '3'
services:
  postgres:
    image: postgres:latest
    environment:
      - POSTGRES_PASSWORD=postgres_password
    ports:
      - '5435:5432'
  web-app:
    build:
      context: ./client
      dockerfile: Dockerfile.dev
    volumes:
      - /app/node_modules
      - ./client:/app
    ports:
      - '4001:3000'
    restart: on-failure
  to-do-api:
    build:
      context: ./server
      dockerfile: Dockerfile.dev
    ports:
      - '5001:3001'
    restart: on-failure
    volumes:
      - /app/node_modules
      - ./server:/app
    environment:
      - PGUSER=postgres
      - PGHOST=postgres
      - PGDATABASE=postgres
      - PGPASSWORD=postgres_password
      - PGPORT=5432

index.js

require('dotenv').config();

// Express App Setup
const express = require('express');
const http = require('http');
const bodyParser = require('body-parser');
const cors = require('cors');
const uuid = require('uuid/v4');

// Config
const config = require('./config');

// Initialization
const app = express();
app.use(cors());
app.use(bodyParser.json());

// Postgres client
const { Pool, Client } = require('pg');

console.log('config.pgUser', config.pgUser);

const pool = new Pool({
  user: config.pgUser,
  host: config.pgHost,
  database: config.pgDatabase,
  password: config.pgPassword,
  port: config.pgPort,
  max : 20,
 
});

async function testConnection() {
  try {
   return await pool.query("DROP TABLE IF EXISTS task"+
   "CREATE TABLE task (id serial PRIMARY KEY, name VARCHAR(50), lastname VARCHAR(50));");
  } catch (e) {
    console.log(e)
 }

async function main() {
  await testConnection();
}

main()
  .then (() => {
      console.error('Done');
      process.exit(0);
  })
  .catch((err) => {
      console.error('Error: %s', err);
      console.error('Error: %s', err.stack);
      process.exit(1);
  });

main();

pool.on('error', () => console.log('Lost Postgres connection'));



// Server
const port = process.env.PORT || 3001;
const server = http.createServer(app);
server.listen(port, () => console.log(`Server running on port ${port}`));

注意:我正在尝试连接到在 docker 容器中运行的 postgres,并通过使用节点 postgresql 运行查询来创建表

确保您使用的是 postgres npm 依赖项的最新版本之一。

您可以通过在 express 服务器文件夹中的 package.json 文件中的 depencecies 对象中添加"pg": "8.7.1"来设置 pg npm 包版本 8.7.1。

可能有两个原因:

  1. 您需要在 docker 撰写文件中传递环境变量,例如:POSTGRES_DB、POSTGRES_USER 和 POSTGRES_PASSWORD。 例如:

 # docker-compose.yml version: '3.1' services: db: image: postgres restart: always container_name: 'Postgresql' ports: - "5432:5432" environment: POSTGRES_USER: admin POSTGRES_PASSWORD: postgres POSTGRES_DB: postgres volumes: -./data:/var/lib/postgresql/data

  1. 有时,如果您在 windows 中工作,您需要在 CMD 中使用 ipconfig 命令找到您的 IPv4 地址,并将其替换为 localhost。

这对我有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM