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 opg8.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 porta5432. 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 opg:
.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:
.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
@, / ou #, codifique-os com percent-encoding na URL.
Configure o pool de conexões
Crie o arquivodb.mjs. Ele exporta um único pool, compartilhado pelo restante da aplicação:
db.mjs
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.
Crie o schema
Crie o arquivosetup.mjs. Ele cria as tabelas, insere duas contas usando consultas parametrizadas e, em seguida, lê os dados de volta:
setup.mjs
$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:
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 compool.connect e sempre o libere ao final. Crie transfer.mjs:
transfer.mjs
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 arquivoserver.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
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: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:
pg_stat_ssl:
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 porta6432 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 usampool.connectfuncionam conforme mostrado neste guia. PREPAREeEXECUTEem nível de SQL, bem como configurações de sessão definidas comSET, não persistem entre transações. Nesse caso, useSET LOCALdentro de uma transação.pg_stat_sslreporta a conexão entre o PgBouncer e o Postgres, por isso a consulta de verificação de TLS acima retornassl: 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
- Conexão: strings de conexão, PgBouncer e TLS
- Configurações: altere parâmetros como
max_connections - Réplicas de leitura: envie consultas read-only para uma réplica
- Alta disponibilidade: standbys e failover