Como usar Node.js + MySQL

Hoje vou ensinar como que você pode usar Node.js com MySQL. Apesar de MongoDB e demais bases não relacionais serem a escolha mais comum com Node, muitos programadores, geralmente de background PHP, conhecem e usam MySQL e não querer abrir mão de seu conhecimento a respeito.

Além disso, como pessoal da Rising Stack afirma, com bons índices e planejamento adequado, o MySQL pode ser excelente. Sendo assim, acredito que este post ajudará quem estiver migrando de plataforma, mas não quer migrar de banco.

Existem diversas maneiras de usar MySQL com Node. Uma vez que é um banco de dados muito popular, logo, é possível que você encontre muita informação diferente na Internet à respeito. Entenda que te mostrarei UMA das INÚMERAS opções de como conectar no MySQL com Node.js.

Também é importante salientar que parto do pressuposto que você já saiba usar MySQL, já tem uma base criada na sua máquina ou em algum provedor (recomendo a Umbler) e que também já saiba o básico de Node.js. Vou me focar aqui em “ligar as pontas”.

Para um tutorial ainda mais iniciante que esse, sugiro este.

Se preferir, pode assistir ao vídeo abaixo ao invés de ler o tutorial.

Então vamos lá!

Criando o Projeto

Crie uma pasta para o projeto, com o nome que quiser.

Dentro, crie um db.js e um index.js, ambos vazios.

Abra o terminal e dentro dessa pasta rode um npm init para inicializar o projeto e criar o package.json.

Ainda no terminal, mande instalar a dependência mysql2, como abaixo.

Por que mysql2 e não o pacote mysql padrão?

Porque o mysql2 possui uma performance muito superior e suporte a Promises, o que nos permite escrever um código JavaScript mais moderno e elegante.

Dito isso, vamos em frente!

Criando a conexão

Agora vamos abrir o nosso db.js e criar a conexão com nosso banco de dados, usando o pacote que acabamos de instalar. Vou largar o código, e explico na sequência.

Ignore o primeiro if, vamos para o ‘const mysql’. Nós começamos a conexão carregando o nosso pacote, mais especificamente o wrapper mysql2/promise que é justamente o que nos dá o suporte a Promises que comentei antes.

Com esta constante mysql, consigo chamar a function createConnection que espera a nossa connection string com o banco. Aqui você deve substituir pelos dados da sua instalação de MySQL, no formato mysql://usuario:[email protected]:porta/banco

Note que usei a palavra reservada await antes do createConnection. Isso porque o createConnection é assíncrono, o que me obriga a usar callback, promise ou async/await para garantir que a instrução a seguir só aconteça depois da conexão já estabelecida.

Optei pelo await por ser a forma mais moderna (ES6), mas ele me obriga a usar a keyword async antes da declaração da minha function, como deve ter reparado também.

No fim da function de conexão, eu armazeno ela em uma variável global e agora sim faz sentido eu lhe explicar o primeiro if do código.

Como eu não quero ficar criando um monte de conexões com o MySQL (isso é lento e consome muitos recursos do servidor), eu vou criar apenas uma, compartilhar em uma variável global e, quando a conexão for chamada pela segunda vez, ela vai cair naquele if inicial que verifica se já não existe uma conexão global conectada. Se existir, ela vai ser reaproveitada ao invés de criar uma nova.

Uma técnica mais avançada que essa é usando pool de conexões, ou mesmo um ORM, mas que fogem do escopo deste post mais introdutório.

Para testar este código, crie uma chamada a esta conexão ao fim do módulo e importe-o no index.js, para dispará-la.

Como resultado, irá imprimir no console a mensagem de que se conectou com sucesso no MySQL.

Curso Node.js e MongoDB
Curso Node.js e MongoDB

SELECT

Certo, fizemos a conexão, e agora como vamos utilizá-la para fazer um CRUD básico no MySQL?

No mesmo módulo db.js, cria outra function, desta vez para select, logo abaixo da anterior.

Esta função é beeem mais simples que a outra. Nela, nós realizamos a conexão (que internamente vai decidir reaproveitar ou não) e depois usamos a função query com este objeto connection recém criado.

O SQL em si dispensa aplicações, mas o retorno do query é um array de arrays cheio de coisas, onde queremos somente o array nomeado rows, que traz as linhas resultantes da consulta.

Note o uso de await para que fique mais fácil de gerenciar tanto o retorno da conexão quanto o retorno da query, deixando-os visualmente síncronos (eles não deixam de ser assíncronos, é apenas efeito visual ou syntax sugar).

No fim do módulo, diferente da função de connect, exportamos esta função pois queremos usar ela no nosso index.js.

Falando nele…

Note que dei uma incrementada boa aqui, mas nada muito complicado.

Primeiro, temos o require do nosso db, uns logs de marcação e na sequência chamo a função de selectCustomers exportada no módulo db que vai retornar o nosso array de clientes, que vou só jogar no console, mas que em uma aplicação real tenho certeza que você será mais criativo.

Como estou usando o await aqui também, e ele existe ser usado em funções async, criei uma função async anônima ao redor de todo código que automaticamente é chamada quando mandarmos executar o index.js.

Faça isso agora e verá que funciona como deveria, printando no console todos os clientes do seu banco de dados, tabela clientes.

INSERT

Agora é hora de inserirmos clientes no MySQL via JavaScript!

Volte ao nosso db.js e insira uma nova função.

Esta função tem algumas novidades em relação à anterior.

primeiro, o SQL possui conteúdo dinâmico, que são os valores a serem inseridos na linha da tabela clientes. E embora seja muito tentado concatenar a string SQL na mão, não faça isso sob risco de SQL Injection!

Ao invés disso, coloque ‘?’ no lugar dos campos em quando chamar o conn.query, o segundo parâmetro aceita um array de valores que serão corretamente substituídos na sua string SQL, já prevendo SQL Injection.

No mais, a construção desta função segue a regra das anteriores e não esqueça de exportá-la no seu db.js para usarmos no index.js, como abaixo.

Optei por colocá-lo antes do SELECT, para que fique mais fácil de ver se ele funcionou ou não.

Também optei por printar o seu resultado, para você ver o que ele devolve, embora a maior parte das informações não seja muito útil, somente o número de linhas afetadas na tabela talvez lhe interesse pois, no fundo, se der algum erro na execução do SQL, vai disparar uma exception que vai derrubar essa nossa aplicação bem simples. Sim, você pode embrulhar tudo com try/catch para tratar os erros.

UPDATE

Avançando rapidamente, pois acredito que agora você já “pegou a manha”, o updateCustomer ficaria como abaixo.

Note o mesmo padrão de construção do INSERT, com a leve diferença que o update requer um ID, importantíssimo nesse tipo de comando SQL.

E no index.js, seguimos a mesma estrutura do INSERT também, apenas tome cuidado para informar um ID existente na sua base de dados ao invés do meu ‘6’, ou até mesmo modifique o código para pegar um dos ids retornados pelo SELECT anterior.

DELETE

E para finalizar, nosso deleteCustomer no db.js.

Aqui, ficou ainda mais simples que nos anteriores e o nosso index.js teve apenas mais uma adição que é mais do mesmo.

O resultado de todos esses códigos e testes?

Uma tabela clientes cheia de Zés, hahaha

Espero que tenha gostado do post e até a próxima!

Curtiu o post? Então clica no banner abaixo e dá uma conferida no meu livro sobre programação web com Node.js com MySQL!

Publicado por

Luiz Duarte

Pós-graduado em computação, professor, empreendedor, autor, Agile Coach e programador nas horas vagas.