Curso de FrontendTutorial5 min de leitura

Criando uma rota GET para buscar dados no banco

Rota GET em Node.js consultando banco de dados

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 dev

Testando 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.

Compartilhar

Voltar ao blog
Avatar 3D de argila do Close Luca
Sobre o autor45 artigos publicados

Luca

Desenvolvedor de software

Desenvolvedor de software, criador de projetos web e entusiasta de game design. Escreve sobre programação, desenvolvimento de jogos, produtividade e tecnologia aplicada a produtos digitais.

Compre pelo link do canal
Continue lendo
Ver todos os artigos
Configuração inicial de backend Node.js
Curso de Frontend4 min

Criando o repositório backend-node e instalando o projeto

Crie o repositório backend-node, inicialize o projeto com npm init e instale as dependências principais.

Ler artigo
Curso de backend para iniciantes com Node.js
Curso de Frontend2 min

O que é backend, para que serve e quando é útil

Entenda o que é backend, quando ele é útil e como Node.js pode ser usado para criar APIs e servidores.

Ler artigo
CORS configurado em backend Express
Curso de Frontend3 min

CORS explicado com calma

Entenda por que o navegador bloqueia requisições e como configurar CORS corretamente no backend Node.js.

Ler artigo