O código é usado para subir um servidor que faz a conexão com o SGBD PostgreSQL. O SGBD pode estar no localhost ou em alguma cloud. Porém, sugere-se o uso de uma instância do SGBD PostgreSQL no Render.
Antes de prosseguir é necessário ter instalado o Node.js (https://nodejs.org/en/download) e o git (https://git-scm.com/downloads) no seu computador.
Digite o comando a seguir no CMD (Prompt de comando) para baixar o projeto no seu computador:
git clone https://github.com/arleysouza/api-1dsm-server servidor
Se tudo deu certo, foi criada a pasta servidor
no local que você fez o download. Digite os comandos a seguir para entrar dentro da pasta servidor
e para instalar as dependências necessárias:
cd servidor
npm i
O BD pode ser criado localmente (Passos 1 a 4) ou no Render (Passos 5 a 9).
- Acesse o SGBD PostgreSQL usando o pgAdmin e crie um BD de nome
bdabp
; - No pgAdmin, execute os comandos SQL que estão no arquivo
src/suporte/clausulas_SQL.txt
para criar as tabelas do modelo de BD e carregar alguns dados de teste; - No VS Code, atualize o arquivo
.env
para ter os dados de conexão com o BDbdabp
, ou algum outro nome que você tenha dado. As variáveis de ambientes do arquivo.env
possuem os parâmetros usados para fazer a conexão ao BD no SGBD:
PORTA = 3030
BDUSUARIO = postgres
BDHOST = localhost
BDNOME = bdabp
BDSENHA = 123
BDPORTA = 5432
- No VS Code, acesse o arquivo
src/controladores/bd.js
e descomente o código a seguir. Esse código faz uso das variáveis de ambientes do arquivo.env
para obter os parâmetros de conexão com o SGBD PostgreSQL:
const pool = new Pool({
user: process.env.BDUSUARIO,
host: process.env.BDHOST,
database: process.env.BDNOME,
password: process.env.BDSENHA,
port: process.env.BDPORTA
});
Comente o código a seguir, pois não faz sentido fazer a conexão para dois SGBDs distintos:
const pool = new Pool({
connectionString: process.env.BDURI,
ssl: {
// Ajuste necessário caso esteja utilizando SSL e seu ambiente requeira essa configuração
rejectUnauthorized: false
}
});
- Acesse o Render e crie uma instância do SGBD PostgreSQL, por exemplo, forneça o nome
abp-1dsm-sgbd
; - No Render, copie
External Database URL
, que é URL de acesso a instância do SGBD; - No VS Code, atualize o arquivo
.env
para ter somente as variáveisPORTA
eBDURI
, sendo que a variávelBDURI
terá a URL copiada deExternal Database URL
:
PORTA = 3030
BDURI = postgres://bdabp:cole-aqui-a-sua-URL@usuario.oregon-postgres.render.com/bdabp
- No VS Code, acesse o arquivo
src/controladores/bd.js
e descomente o código a seguir. Esse código faz uso das variáveis de ambientes do arquivo.env
para obter os parâmetros de conexão com o SGBD PostgreSQL:
const pool = new Pool({
connectionString: process.env.BDURI,
ssl: {
// Ajuste necessário caso esteja utilizando SSL e seu ambiente requeira essa configuração
rejectUnauthorized: false
}
});
Comente o código a seguir, pois não faz sentido fazer a conexão para dois SGBDs distintos:
const pool = new Pool({
user: process.env.BDUSUARIO,
host: process.env.BDHOST,
database: process.env.BDNOME,
password: process.env.BDSENHA,
port: process.env.BDPORTA
});
- No CMD (prompt de comando), acesse a pasta onde está instalado o SGBD PostgreSQL no seu computador e localize o programa PSQL na pasta
bin
. Um exemplo de caminho pode serC:\Program Files\PostgreSQL\14\bin
. Digite o comando psql seguido peloExternal Database URL
:
psql postgres://bdabp:cole-aqui-a-sua-URL@usuario.oregon-postgres.render.com/bdabp
Se tudo der certo você estará conectado à instância do BD no Render. Copie e cole os comandos SQL a seguir nesse terminal para criar as tabelas tbusuario
e tbquestao
. Essas tabelas serão usados para você testar o código, posteriormente, você terá de criar mais tabelas:
DROP TABLE if exists tbusuario;
DROP TABLE if exists tbquestao;
CREATE TABLE tbusuario (
idusuario SERIAL PRIMARY KEY,
mail VARCHAR(50) NULL,
nome VARCHAR(50) NULL
);
CREATE TABLE tbquestao (
idquestao SERIAL PRIMARY KEY,
enunciado VARCHAR(256) NULL,
resposta BOOL NULL
);
INSERT INTO tbquestao (enunciado, resposta)
VALUES
('Uma variável é um espaço na memória do computador?', true),
('O tipo de dado é o conteúdo da variável?', false),
('Os tipos de dados podem ser primitivos ou objetos?', true),
('Na estrutura decisão if...else o bloco if pode existir sem o bloco else?', true ),
('Na estrutura decisão if...else o bloco else pode existir sem o bloco if?', false),
('A estrutura de decisão if...else pode ser aninhada dentro de um bloco if ou else?', true),
('Uma estrutura de repetição for pode ser usada quando o número de iterações é desconhecido?', false),
('O loop do...while executa o bloco de código pelo menos uma vez, mesmo se a condição for inicialmente falsa?', true),
('Em uma estrutura de repetição while, o bloco de código é executado enquanto a condição especificada for falsa?', false);
Após criar as tabelas, submeta o comando SQL select * from tbquestao;
para verificar se deu certo.
No terminal do VS Code, execute um dos comandos a seguir para subir o servidor na porta 3030
, que é o conteúdo da variável de ambiente PORTA
:
npm run dev
ou
npm start
As rotas estão mapeadas no servidor no arquivo src/index.js
. Atualmente existem as rotas /usuario
, /login
e /questao
. Uma rota é formado pelo caminha + método HTTP. As rotas /usuario
e /login
usam o método HTTP POST.
// Define a rota /usuario usando o método HTTP POST
// A rota é mapeada para a função criar
app.post("/usuario", criar);
// Define a rota /login usando o método HTTP POST
app.post("/login", buscar);
// Define a rota /usuario usando o método HTTP GET
app.get("/questao", listar);
Qualquer outra rota será tratada pelo código a seguir:
app.use(function(req,res){
res.json({erro:"Rota desconhecida"});
});
A rota /questao
responde a lista de questões e pode ser testada diretamente no navegador, por ela usar o método HTTP GET, já as demais rotas não funcionam diretamente no navegador:
http://localhost:3030/questao
A rota /login
requer que o cliente envie o e-mail e, por utilizar o método HTTP POST, não pode ser testada diretamente no navegador:
http://localhost:3030/login