Skip to main content
O node-postgres (o pacote pg) é o driver Postgres mais usado para Node.js. Neste guia, você vai se conectar ao ClickHouse Managed Postgres por meio de um pg.Pool com verificação completa de certificados TLS, criar duas tabelas, transferir dinheiro entre contas em uma transação e servir os dados a partir de um pequeno servidor node:http.

Pré-requisitos

  • Node.js 20.6 ou superior (para usar a flag nativa --env-file). Este guia foi testado com o Node.js 24.21.0 e o pg 8.23.1.
  • Uma conta no ClickHouse Cloud
  • psql, para criar o banco de dados

Crie um serviço ClickHouse Managed Postgres

No console do ClickHouse Cloud, clique em New service e selecione Postgres. A instância fica pronta em poucos minutos. Para um passo a passo completo, consulte o guia de início rápido.

Obtenha os detalhes de conexão

Clique em Connect na barra lateral esquerda do seu serviço. Com Directly selecionado, copie a URL de conexão na aba url. Deixe Use SSL desativado: a aplicação fornece o certificado da CA no código, e não na URL (consulte Configure o pool de conexões). Este guia se conecta diretamente ao Postgres na porta 5432. Um servidor Node.js de longa duração já mantém seu próprio pool de conexões por meio do pg.Pool, portanto não precisa de um segundo pooler à frente do Postgres. Se você executa muitos processos ou funções serverless, use o PgBouncer incluído; consulte Use o PgBouncer. Em seguida, baixe o certificado da CA da sua instância. Ative Use SSL e clique em Download CA certificate ou acesse Settings → CA Certificate → Download CA certificate. O certificado é exclusivo da sua instância.

Configure o projeto

Crie um projeto e instale o pg:
Vai adicionar a um app existente?Pule as etapas mkdir e npm init -y. No seu projeto, execute npm install pg e depois siga para Criar o banco de dados.
Os exemplos deste guia são módulos ES com a extensão .mjs, por isso funcionam independentemente de o seu package.json usar CommonJS ou módulos ES.

Criar o banco de dados

Mova o arquivo <service-name>-ca-certificate.pem baixado para o diretório do projeto e renomeie-o para ca-certificate.pem. Em seguida, crie um banco de dados para a aplicação:
Crie um arquivo .env com a URL de conexão que você copiou, alterando o nome do banco de dados para guide_nodejs, e com o caminho do certificado:
.env
Se a sua senha contiver caracteres como @, / ou #, codifique-os com percent-encoding na URL.

Configure o pool de conexões

Crie o arquivo db.mjs. Ele exporta um único pool, compartilhado pelo restante da aplicação:
db.mjs
Passar ssl: { ca } equivale a usar sslmode=verify-full: o pg verifica se o certificado do servidor foi assinado pela CA da sua instância e se ele corresponde ao hostname. O valor padrão de rejectUnauthorized é true; não o altere para false.
Não combine ssl com parâmetros SSL na URLSe a DATABASE_URL contiver sslmode ou sslrootcert, o pg monta as configurações de TLS a partir da URL e ignora o objeto ssl. Por exemplo, uma URL terminada em ?sslmode=verify-full sem sslrootcert substitui a sua ca, e a conexão falha com unable to verify the first certificate. Não inclua parâmetros SSL na DATABASE_URL quando passar ssl no código.Observe também que:
  • Sem um objeto ssl nem sslmode na URL, o pg não usa TLS nem verifica o servidor.
  • O pg lê PGHOST, PGUSER, PGPASSWORD e variáveis semelhantes, mas não lê PGSSLROOTCERT. Portanto, as variáveis da aba env do modal Connect não bastam, sozinhas, para verificar o servidor.
  • Se preferir manter tudo na URL, a URL exibida pelo modal Connect com Use SSL ativado também funciona com o pg, por exemplo ...?sslmode=verify-full&sslrootcert=ca-certificate.pem. Nesse caso, remova a opção ssl e lembre-se de que sslrootcert é resolvido em relação ao diretório a partir do qual você inicia o Node.js.

Crie o schema

Crie o arquivo setup.mjs. Ele cria as tabelas, insere duas contas usando consultas parametrizadas e, em seguida, lê os dados de volta:
setup.mjs
Sempre passe os valores como parâmetros ($1, $2, …) em vez de concatená-los na string SQL. O pg os envia separadamente do texto da consulta, o que evita injeção de SQL. Arrays JavaScript são mapeados para arrays do Postgres, como na consulta com ANY($1). Execute:
O pg retorna valores numeric (e bigint) como strings para evitar perda de precisão. Se precisar de números, converta-os explicitamente.

Execute consultas em uma transação

Uma transação precisa ser executada em uma única conexão; por isso, obtenha um cliente com pool.connect e sempre o libere ao final. Crie transfer.mjs:
transfer.mjs
Não use pool.query para as instruções dentro de uma transação: cada chamada a pool.query pode ser executada em uma conexão diferente.

Disponibilize os dados via HTTP

Crie o arquivo server.mjs. Ele disponibiliza as contas e as transferências em JSON na porta 3107, aceita novas transferências e é encerrado corretamente ao receber SIGINT (Ctrl+C) ou SIGTERM:
server.mjs
Chame pool.end uma única vez, quando o processo for encerrado, e não após cada requisição. Ele aguarda a liberação dos clientes em uso e, em seguida, fecha todas as conexões.

Verificar

Inicie o servidor:
Em um segundo terminal, faça uma transferência e, depois, tente fazer uma que deixaria uma conta com saldo negativo e outra para uma conta que não existe:
A terceira transferência já havia debitado de alice quando falhou, mas o ROLLBACK a desfez. Abra http://localhost:3107/accounts no navegador para ver os saldos. A resposta será semelhante a esta:
Para confirmar que a conexão usa TLS verificado, execute uma consulta na pg_stat_ssl:
Se você apontar DATABASE_CA_CERT para qualquer outro certificado, a conexão falhará com unable to verify the first certificate, o que comprova que o certificado do servidor está de fato sendo verificado. Por fim, encerre o servidor com Ctrl+C. Ele exibirá SIGINT received, shutting down e, em seguida, Pool closed. Você também pode visualizar os dados no console. Abra o SQL Console, expanda o banco de dados guide_nodejs e abra a tabela accounts:

Usar o PgBouncer

Para se conectar pelo PgBouncer incluído, selecione via PgBouncer no modal Connect e use a porta 6432 em DATABASE_URL. Não é necessário alterar o código, e o mesmo certificado de CA continua funcionando. O PgBouncer é executado no modo de transaction pooling, portanto cada transação pode ser executada em uma conexão diferente do Postgres. Com pg:
  • Consultas parametrizadas, prepared statements nomeados (pool.query({ name, text, values })) e transações que usam pool.connect funcionam conforme mostrado neste guia.
  • PREPARE e EXECUTE em nível de SQL, bem como configurações de sessão definidas com SET, não persistem entre transações. Nesse caso, use SET LOCAL dentro de uma transação.
  • pg_stat_ssl reporta a conexão entre o PgBouncer e o Postgres, por isso a consulta de verificação de TLS acima retorna ssl: false. A conexão da sua aplicação com o PgBouncer continua sendo verificada: um certificado de CA incorreto falha da mesma forma.

Próximos passos

Última modificação em 14 de outubro de 2026