Criando uma rota GET para buscar dados no banco

Crie uma rota GET no backend Node.js com Express para buscar dados no banco MySQL.
- #Curso de Frontend
- #API com Node.js
- #Node.js
- #Express
- #MySQL
- #GET
O que vamos criar
Vamos criar a rota GET /api/search?q=html. Ela recebe o termo de busca, valida, consulta o banco e retorna resultados em JSON.
Antes de começar, confirme três coisas: o banco frontend_course_backend existe, a tabela search_results tem registros e o arquivo backend-node/.env foi criado com os dados do banco.
Arquivo que será alterado
Abra o projeto backend-node no VS Code. O arquivo que vamos alterar é backend-node/src/server.js.
Para evitar código fora de ordem, substitua o conteúdo inteiro de src/server.js pelo código completo da próxima seção.
server.js completo
Este arquivo configura Express, CORS, dotenv, conexão com MySQL, rota de status, rota de busca e app.listen no final.
Cole tudo em backend-node/src/server.js e salve.
import express from "express";
import cors from "cors";
import dotenv from "dotenv";
import mysql from "mysql2/promise";
dotenv.config();
const app = express();
const port = process.env.PORT || 3001;
const allowedOrigin = process.env.CORS_ORIGIN || "http://localhost:5173";
app.use(cors({ origin: allowedOrigin }));
app.use(express.json());
const pool = mysql.createPool({
host: process.env.DB_HOST,
port: Number(process.env.DB_PORT || 3306),
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
app.get("/api/status", function (req, res) {
res.json({
message: "Backend funcionando"
});
});
app.get("/api/search", async function (req, res) {
try {
const term = String(req.query.q || "").trim();
if (!term) {
return res.status(400).json({
message: "Informe um termo de busca no parâmetro q.",
data: []
});
}
const searchTerm = `%${term}%`;
const sql = `
SELECT id, title, description, url, category
FROM search_results
WHERE title LIKE ?
OR description LIKE ?
OR category LIKE ?
ORDER BY title
LIMIT 20
`;
const [rows] = await pool.execute(sql, [searchTerm, searchTerm, searchTerm]);
if (rows.length === 0) {
return res.status(404).json({
message: "Nenhum resultado encontrado.",
data: []
});
}
return res.json({
message: "Resultados encontrados.",
data: rows
});
} catch (error) {
console.error("Erro ao buscar resultados:", error);
return res.status(500).json({
message: "Erro interno ao buscar resultados.",
data: []
});
}
});
app.listen(port, function () {
console.log(`Servidor rodando em http://localhost:${port}`);
});Como ler os imports e configurações
As primeiras linhas importam as bibliotecas usadas pelo arquivo: express para criar o servidor, cors para liberar o acesso do frontend, dotenv para ler o .env e mysql2/promise para conversar com o banco usando async e await.
Depois disso, dotenv.config() carrega o .env, app cria o servidor Express, port define a porta e allowedOrigin define qual frontend pode chamar a API. app.use(cors(...)) e app.use(express.json()) são middlewares aplicados antes das rotas.
Como ler o pool de conexão
O pool é a configuração de conexão com o banco. Ele lê host, porta, usuário, senha e nome do banco a partir do .env. Isso evita deixar credenciais fixas dentro do código.
waitForConnections, connectionLimit e queueLimit controlam como o mysql2 reaproveita conexões. Para o curso, o mais importante é entender que pool.execute será usado depois para executar a consulta SQL com segurança.
Como ler a rota de busca
app.get("/api/search", async function (req, res) { ... }) cria uma rota GET. O async permite usar await dentro da função, porque a consulta ao banco demora um pouco e não acontece instantaneamente.
req.query.q lê o parâmetro q da URL. Em /api/search?q=html, o valor de q é html. String(...).trim() transforma o valor em texto e remove espaços no começo e no fim.
Se o termo estiver vazio, o backend responde status 400 porque a pessoa não informou o dado necessário para buscar.
Como ler a consulta e as respostas
searchTerm coloca porcentagem antes e depois do termo para permitir busca parcial com LIKE. A consulta SQL usa três pontos de interrogação porque o termo será comparado com title, description e category.
pool.execute(sql, [searchTerm, searchTerm, searchTerm]) envia a consulta e os valores separados. Essa separação é importante para não montar SQL concatenando texto digitado pela pessoa usuária.
Se rows vier vazio, a API responde 404 com data vazio. Se houver resultados, responde 200 com message e data. Se algo inesperado falhar, o catch registra o erro no terminal e responde 500.
Rodando o backend
No terminal do VS Code, confirme que você está dentro da pasta backend-node. Depois rode o servidor.
Se o servidor iniciar corretamente, o terminal mostrará Servidor rodando em http://localhost:3001. Deixe esse terminal aberto enquanto testa as rotas.
npm run devTestando no navegador
Abra o navegador e acesse primeiro http://localhost:3001/api/status. A resposta esperada é Backend funcionando.
Depois acesse http://localhost:3001/api/search?q=html. A resposta esperada é um JSON com message igual a Resultados encontrados e data com pelo menos um item.
Teste também http://localhost:3001/api/search sem o parâmetro q. A resposta esperada é status 400 com a mensagem Informe um termo de busca no parâmetro q.
Se der erro
Se aparecer erro de conexão com banco, confira se o Laragon está aberto, se o MySQL está iniciado e se DB_HOST, DB_PORT, DB_USER, DB_PASSWORD e DB_NAME no .env estão iguais aos dados da sua conexão local.
Se aparecer que a tabela não existe, volte ao artigo de SQL e execute novamente os comandos de criação do banco e da tabela. Se a busca retornar nenhum resultado, confirme se o INSERT foi executado e se SELECT * FROM search_results mostra registros.







