Atualizado: 02/01/2025

MySQL e Express - Node.js

Vamos criar uma aplicação web simples que interage com um banco de dados MySQL. Utilizaremos um banco de dados já criado, que armazena usuários e possui três colunas: id, name e age.

Primeiro, vamos definir um novo projeto e adicionar os pacotes express, mysql2 e handlebars:

npm install --save hbs express mysql2

Para a parte visual, utilizaremos as visualizações do Handlebars. Portanto, vamos criar uma nova pasta chamada views no projeto e adicionar um novo arquivo index.hbs:

<!DOCTYPE html>
<html>
<head>
    <title>Lista de Usuários</title>
    <meta charset="utf-8" />
</head>
<body>
    <h1>Lista de Usuários</h1>
    <p><a href="/create">Adicionar Usuário</a></p>
    <table>
        <tr><th>Nome</th><th>Idade</th><th></th></tr>
        {{#each users}}
            <tr>
                <td>{{this.name}}</td>
                <td>{{this.age}}</td>
                <td>
                    <a href="/edit/{{this.id}}">Editar</a>|
                    <form action="delete/{{this.id}}" method="POST" style="display:inline;">
                        <input type="submit" value="Excluir" />
                    </form>
                </td>
            </tr>
        {{/each}}
    </table>
</body>
<html>

Essa visualização exibe uma lista de objetos em forma de tabela. Ao lado de cada objeto, há um link para editar e um botão para excluir o objeto. Acima da tabela, há um link para adicionar novos objetos.

Vamos também adicionar um novo arquivo create.hbs na pasta views, contendo um formulário para criar um novo objeto:

<!DOCTYPE html>
<html>
<head>
    <title>Adicionar Usuário</title>
    <meta charset="utf-8" />
    <style>.field{width:180px;}</style>
</head>
<body>
    <h1>Adicionar Usuário</h1>
        <form method="POST">
        <label>Nome</label><br>
        <input name="name" class="field"/><br><br>
        <label>Idade</label><br>
        <input name="age" type="number" class="field" min="1" max="110" /><br><br>
        <input type="submit" value="Enviar" />
        </form>
        <a href="/">Voltar à Lista de Usuários</a>
</body>
<html>

Além disso, adicionaremos um novo arquivo edit.hbs na pasta views, com um formulário para editar um objeto:

<!DOCTYPE html>
<html>
<head>
    <title>Editar Usuário</title>
    <meta charset="utf-8" />
    <style>.field{width:180px;}</style>
</head>
<body>
    <h1>Editar Usuário</h1>
        <form action="/edit" method="POST">
        <input type="hidden" name="id" value="{{user.id}}" />
        <label>Nome</label><br>
        <input name="name" value="{{user.name}}"  class="field" /><br><br>
        <label>Idade</label><br>
        <input name="age" type="number" min="1" max="110" value="{{user.age}}"  class="field" /><br><br>
        <input type="submit" value="Enviar" />
        </form>
        <a href="/">Voltar à Lista de Usuários</a>
</body>
<html>

Agora, na pasta raiz do projeto, vamos definir o arquivo app.js, que será o arquivo principal da aplicação:

Por fim, o projeto terá a seguinte estrutura:

nodejs-mysql-express/
│
├── node_modules/
├── views/
│    ├── create.hbs
│    ├── edit.hbs
│    └── index.hbs
├── app.js
└── package.json

Ao acessar a raiz da aplicação, o seguinte método é acionado:

app.get("/", function(req, res) {
    pool.query("SELECT * FROM users", function(err, data) {
      if(err) return console.log(err);
      res.render("index.hbs", {
          users: data
      });
    });
});

Esse método obtém os dados do banco de dados e os envia para a visualização index.hbs. Se já houver dados no banco de dados, ao iniciar a aplicação, veremos esses dados na página:

Recebendo dados do MySQL em Node.js

Ao clicar no link para adicionar um novo usuário, uma requisição GET é enviada ao servidor, que será processada pelo seguinte método:

app.get("/create", function(req, res) {
  res.render("create.hbs");
});

Esse método retorna ao usuário o formulário de adição:

Adicionando dados do MySQL em Node.js

Depois de preencher o formulário e clicar no botão, os dados são enviados em uma requisição POST para o método:

app.post("/create", urlencodedParser, function (req, res) {
         
  if(!req.body) return res.sendStatus(400);
  const name = req.body.name;
  const age = req.body.age;
  pool.query("INSERT INTO users (name, age) VALUES (?,?)", [name, age], function(err, data) {
    if(err) return console.log(err);
    res.redirect("/");
  });
});

Esse método recebe os dados enviados e, por meio do comando SQL INSERT, os insere no banco de dados.

Ao clicar no link de edição na lista de objetos, o id do objeto é passado para o próximo método em uma requisição GET:

app.get("/edit/:id", function(req, res) {
  const id = req.params.id;
  pool.query("SELECT * FROM users WHERE id=?", [id], function(err, data) {
    if(err) return console.log(err);
     res.render("edit.hbs", {
        user: data[0]
    });
  });
});

Esse método obtém o id, recupera o objeto correspondente no banco de dados e o envia para o formulário na visualização edit.hbs:

Editando dados do MySQL em Node.js

Após a edição e o envio do formulário, os dados são enviados em uma requisição POST para o seguinte método:

app.post("/edit", urlencodedParser, function (req, res) {
         
  if(!req.body) return res.sendStatus(400);
  const name = req.body.name;
  const age = req.body.age;
  const id = req.body.id;
  pool.query("UPDATE users SET name=?, age=? WHERE id=?", [name, age, id], function(err, data) {
    if(err) return console.log(err);
    res.redirect("/");
  });
});

Esse método recebe os dados e, utilizando o comando UPDATE, atualiza o banco de dados.

Ao clicar no botão de exclusão na lista de objetos, o seguinte método é acionado:

app.post("/delete/:id", function(req, res) {
          
  const id = req.params.id;
  pool.query("DELETE FROM users WHERE id=?", [id], function(err, data) {
    if(err) return console.log(err);
    res.redirect("/");
  });
});

Esse método recebe o id do objeto a ser excluído e o remove do banco de dados usando o comando DELETE.

Assim, conseguimos integrar em uma aplicação Node.js com Express a interação com um banco de dados MySQL.

Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com