AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79551400
Accepted
EnCoder2000
EnCoder2000
Asked: 2025-04-03 03:22:41 +0800 CST2025-04-03 03:22:41 +0800 CST 2025-04-03 03:22:41 +0800 CST

Node.js não consegue se conectar ao Postgres dentro do Docker-Compose

  • 772

Quero executar meu Node.js, Postgres e Ngnix no mesmo contêiner docker, mas estou recebendo o erro abaixo

2025-04-02 20:07:11 Erro de conexão Erro: conectar ECONNREFUSED 127.0.0.1:5432 2025-04-02 20:07:11 em TCPConnectWrap.afterConnect [como oncomplete] (node:net:1555:16)

Por que o aplicativo node.js não consegue se conectar ao banco de dados?

docker-compose.yml



services:
  nginx:
    image: nginx:latest
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
    ports:
      - "80:80"
    depends_on:
      - node-api

  node-api:
    build: .
    environment:
      - DB_HOST=postgres
      - DB_PORT=5432
      - DB_NAME=database
      - DB_USER=postgres
      - DB_PASSWORD=password
    ports:
      - "3000:3000"
    depends_on:
      postgres:
        condition: service_healthy

  postgres:
    image: postgis/postgis:latest
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      POSTGRES_DB: database
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "postgres", "-h", "localhost"]
      interval: 10s
      retries: 5
      start_period: 30s
      timeout: 10s


volumes:
  postgres-data:

Arquivo Docker

# Use an official Node.js runtime as a parent image
FROM node:18

# Set the working directory
WORKDIR /app

# Copy package.json and install dependencies
COPY package.json package-lock.json ./
RUN npm install

# Copy the rest of the application
COPY . .

# Expose the port the app runs on
EXPOSE 3000

# Start the application
CMD ["node", "api/apis.js"]

EDITADO: --------------

api.js

import express from 'express'
import cors from 'cors'
import client from './postgres_connection.js'


const app = express();

app.use(cors());

app.use(express.json());



app.get('/getMarkers', async (req, res) => {
    try {

        const result = await client.query('SELECT * FROM public.topo_markers');
        res.json(result.rows);

    }
    catch (errr) {
        console.error(errr.message);
        res.status(500).send('Internal server error');
    }
});


app.post('/addMarker', async (req, res) => {
    const { title, description, latitude, longitude } = req.body;

    const isBodyEmpty = !title || !description || !latitude || !longitude;

    if (isBodyEmpty) {
        return res.status(400).send('Missing required properties');
    }

    try {
        const query = `
        INSERT INTO public.topo_markers (title, description, geom)
        VALUES ($1, $2, ST_SetSRID(ST_MakePoint($3, $4), 4326)) RETURNING *;
    `;

        const result = await client.query(query, [title, description, longitude, latitude]);

        res.status(201).json(result.rows[0]);

    } catch (errr) {
        console.error(errr.message);
        res.status(500).send('Internal server error');
    }
});

app.listen(3000)

postgres_connection.js

import pg from 'pg';


const client = new pg.Client({
  user: 'postgres',  // Default is usually 'postgres'
  host: 'localhost',           // Use the container's IP if needed
  database: 'test_database',   // Change to your database name
  password: 'password',   // Set this properly
  port: 5432,                  // Default PostgreSQL port
});

client.connect()
  .then(() => console.log('Connected to PostGIS!'))
  .catch(err => console.error('Connection error', err.stack));


export default client;
node.js
  • 1 1 respostas
  • 47 Views

1 respostas

  • Voted
  1. Best Answer
    Hans Kilian
    2025-04-03T03:42:57+08:002025-04-03T03:42:57+08:00

    De acordo com a mensagem de erro, você está tentando se conectar ao Postgres em 127.0.0.1:5432. Então você está usando localhostou 127.0.0.1como o nome do host do postgres no seu aplicativo Node.

    Em um contêiner, localhost é o próprio contêiner. Você precisa usar o postgresnome do serviço compose como o nome do host.

    Parece que você está tentando fazer isso passando postgrescomo DB_HOSTvariável de ambiente para o aplicativo Node, mas, por algum motivo, ele não a está usando.

    Tente olhar seu código Node para ver por que ele não está pegando a variável DB_HOST. Se precisar de ajuda, edite sua postagem e adicione o código node relevante a ela. Se você editar sua postagem, poderá remover o arquivo de configuração Nginx. Isso não é relevante para seu problema.

    EDITAR APÓS O CÓDIGO DO NÓ ADICIONADO À POSTAGEM:

    No seu postgres_connection.js, você está usando valores codificados em vez de usar variáveis ​​de ambiente.

    Tente alterar a configuração do cliente para

    const client = new pg.Client({
      user: process.env.DB_USER,
      host: process.env.DB_HOST,
      database: process.env.DB_NAME,
      password: process.env.DB_PASSWORD,
      port: process.env.DB_PORT,
    });
    

    Então, ele usará os valores das variáveis ​​de ambiente. Suas variáveis ​​de ambiente parecem corretas, então deve funcionar.

    • 3

relate perguntas

  • Não é possível encontrar o módulo "build" no Docker Container

  • Como faço para enviar para o banco de dados node.js depois de clicar no elemento html canvas?

  • Meu script de instalação para um programa trava depois de instalar o npm do node.js e não continua

  • Rest-Api Dynamic Image Path e Express excepto

  • módulo bcrypt não está funcionando de forma assíncrona

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve