Tutorial Node.js com MS SQL Server

Hoje vou ensinar como que você pode usar Node.js com MS SQL Server. Não, essa não é uma dupla muito comum de ver no mercado, o mais normal é que Node.js seja utilizado com MongoDB, ou com MySQL. Eu cheguei a fazer umas pesquisas de tendências antes de escrever este post e MySQL é em média 10x mais utilizado com Node.js. No entanto, recentemente tive de fazer uma API que se comunicava com SQL Server e isso me fez descobrir que esse é um assunto pouco comentado na Internet, então resolvi deixar aqui este tutorial para quem precisar mais tarde (incluindo eu).

Veremos neste artigo (pule seções à vontade):

  1. Criando o banco de dados
  2. Criando e populando a tabela
  3. Criando a API
  4. Criando a listagem de clientes
  5. Criando a pesquisa de um cliente
  6. Excluindo um cliente
  7. Adicionando um cliente
  8. Atualizando um cliente
  9. Bônus 1: Executando muitas operações SQL
  10. Bônus 2: ORM

Então vamos lá!

Parte 1: Criando o banco de dados

Se você já possui um banco de dados SQL Server, ok, use ele e pule para a próxima parte.

Se você não possui um banco SQL Server, você tem duas opções:

  1. baixar e instalar o MS SQL Server Express (gratuito) na sua máquina;
  2. contratar um banco SQL Server na nuvem (pago, mas vou te ensinar um truque);

A primeira opção é um pouco mais trabalhosa, porém é free. Baixe, instale e crie um novo banco de dados para uso nesse tutorial. Durante a instalação, você irá precisar definir uma senha para o usuário ‘sa’, não esqueça dela.

A segunda opção é bem simples, mais vai te custar alguns pilas. Ou não. Na Umbler, empresa em que trabalho como evangelista tecnológico, você ganha créditos de graça para usar livremente conforme vai cumprindo algumas etapas dentro do painel. Crie um site com um domínio qualquer (mesmo que não tenha registrado) e depois vá na parte de banco de dados para criar um do tipo SQL Server. Isso te custará uns R$15 por mês, mas apenas se deixar o mês inteiro funcionando, você pode excluir tudo logo após esse tutorial, se quiser, e não será mais cobrado. Durante a criação do seu banco, você vai definir o nome dele, o usuário e a senha, anote tudo, bem como o endereço do servidor que a Umbler vai te fornecer.

Parte 2: Criando e populando a tabela

Agora que você já tem o banco pronto, vamos criar uma tabela nele e colocar alguns dados de exemplo. Não pule esta etapa pois vamos fazer tudo isso usando Node.js!

Crie uma pasta para guardar os arquivos do seu projeto Node.js, você pode fazer isso pelo console se quiser, usaremos ele algumas vezes nesse tutorial. No exemplo abaixo, criei a pasta e depois entrei dentro dela.

Agora execute no console o comando “npm init” que o próprio NPM (gerenciador de pacotes do Node) vai te guiar para a construção do arquivo package.json, que é o arquivo de configuração do projeto. Se ficar em dúvida ou com preguiça, segue o meu package.json abaixo:

Com o arquivo de configurações criado, vá no console novamente, na pasta do projeto e digite o seguinte comando para instalar a extensão mssql, que permite usar Node com SQL Server:

A flag “-S”diz que é pra salvar essa dependência no arquivo packages.json. Se você abrir o arquivo vai ver que tem coisa nova por lá.

Agora, crie um arquivo create-table.js dentro dessa pasta, que será o arquivo que vai criar e popular nossa tabela que usaremos neste exercícios. Também usaremos ele para entender o básico de comandos SQL, conexão com o banco, etc. Vamos começar nosso create-table.js definindo uma constante para a String de conexão com o banco e uma constante para o objeto que vai carregar a extensão mssql (e que mais tarde usaremos para conectar, executar SQL, etc). Se você já usou SQL Server com C#, a String é a mesma, caso contrário, preencha as lacunas conforme a String de exemplo abaixo:

Agora, usaremos esse objeto sql para fazer uma conexão e, em caso de sucesso, imprimir uma mensagem de sucesso. Caso contrário, se der erro, uma mensagem de falha. Note que existem diversas maneiras de programar este mesmo algoritmo em Node.js: você pode usar a forma clássica com callbacks, a forma intermediária com promises e a forma mais recente com async/await. Eu vou fazer com promises, que acho que é a que fica mais legível:

Se esse código lhe parece muito bizarro, calma, é fácil de entender. O objeto sql permite que façamos coisas no banco de dados, uma delas é a conexão (connect). No entanto, o Node.js trabalha de maneira assíncrona, o que quer dizer que ele não espera pela conexão ser estabelecida, ele retorna uma promessa (promise) de que vai executar algo (o meu ‘then’ ou o meu ‘catch’ se der erro) após a conexão for concluída. Sendo assim, no ‘then’ eu coloco uma função JS que será executada quando a conexão funcionar, e no ‘catch’ uma função JS que será executada em caso de erro.

Neste exemplo usei arrow-functions que está disponível desde o ES6 (versão 2016 do Javascript), que são formas mais simples de declarar funções pequenas. O que vem antes do ‘=>’ (arrow) são os parâmetros da função. O que vem depois são os comandos da mesma. Usarei novamente mais tarde e volto a explicar para você.

Para executar esse arquivo, abra o console (se estiver usando VS Code, apenas aperta F5 com este arquivo aberto no editor) e na pasta do projeto digite:

Agora que sabemos como conectar no SQL Server através de Node.js, é hora de executarmos o comando que vai criar a tabela e popular ela, ao invés de simplesmente imprimir “conectou”. Sendo assim, vamos criar uma função JS nesse arquivo pra fazer a criação da tabela:

Coloque a chamada desta função no ‘then’ após a conexão no banco, passando o objeto conn por parâmetro, como abaixo:

Mande rodar esse arquivo novamente e verá que ele criará o seu banco já com 3 linhas de dados. Se não quiser fazer isso dessa maneira, você pode fazer pela sua ferramenta de gerenciamento do SQL Server (como o Management Studio) ou pelo Visual Studio, se estiver usando ele para programar Node.js.

Parte 3: Criando a API

Agora que já temos nosso banco de dados SQL Server pronto, com dados de exemplo e aprendemos como fazer a conexão nele, vamos criar uma API básica usando Express para conseguir criar um CRUD com Node.js + MS SQL Server no próximo passo. Se já sabe como montar uma API básica com Node + Express, pule esta parte.

Vamos começar adicionando a dependência do Express (framework web) e do Body-Parser (parser para os POSTs futuros) no projeto via linha de comando na pasta do mesmo:

Na sequência, vamos criar um arquivo index.js na pasta do projeto onde vamos criar o nosso servidor da API para tratar as requisições que chegarão em breve. Vamos começar bem simples, apenas definindo as constantes locais que serão usadas mais pra frente:

Vamos usar apenas um pool de conexões global com o servidor MS SQL. Para isso adicione as seguintes linhas logo abaixo do bloco anterior, para conectar no banco de dados assim que a aplicação iniciar (podemos melhorar isso, mas por ora, vamos deixar assim mesmo):

Agora, logo abaixo, vamos configurar nossa aplicação (app) Express para usar o body parser que carregamos da biblioteca body-parser, permitindo que recebamos mais tarde POSTs nos formatos URLEncoded e JSON:

Na sequência, vamos criar um roteador e dentro dele definir uma regra inicial que apenas exibe uma mensagem de sucesso quando o usuário requisitar um GET na raiz da API (/) para ver se está funcionando.

Note que na última linha eu digo que requisições que chegarem na raiz devem ser mandadas para o router. Por fim, adicionamos as linhas abaixo no final do arquivo que dão o start no servidor da API:

Teste sua API executando via console o seu index.js com o comando ‘node index.js’. Você deve ver a mensagem de ‘API funcionando!’ no console, e se acessar no navegador localhost:3000 deve ver o JSON default que deixamos na rota raiz!

API Funcionando
API Funcionando

Parte 4: Criando a listagem de clientes

Agora que temos uma API funcionando, vamos adicionar uma rota /clientes que listará todos os clientes do banco de dados. Para fazer isso, primeiro vamos criar uma função que executará consultas SQL no banco usando o pool de conexões global (conn), como abaixo:

Esta função nós usaremos para consultar todos os clientes e para consultar apenas um também. Agora, vamos criar a rota /clientes logo abaixo da rota / (raiz):

Agora, ao executarmos novamente nosso projeto e acessarmos a URL localhost:3000/clientes, veremos todos os clientes cadastrados no banco de dados (no passo 2, lembra?):

Todos clientes
Todos clientes

E com isso finalizamos a listagem de todos clientes na nossa API!

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

Parte 5: Criando a pesquisa de um cliente

Agora, se o usuário quiser ver apenas um cliente, ele deverá passar o ID do mesmo na URL, logo após o /clientes. Para fazer isso, vamos modificar nossa rota criada no passo anterior, /clientes, para aceitar um parâmetro opcional ID. Além disso, dentro do processamento da rota, se vier o ID, devemos fazer uma consulta diferente da anterior, como mostra o código abaixo, com os ajustes na mesma rota do passo anterior:

O parseInt que coloquei é apenas uma proteção contra SQL Injection uma vez que neste caso o ID deve ser um inteiro válido. Não é a melhor forma de resolver isso, mas vai nos atender por enquanto sem ter de entrar em conceitos mais avançados. Manda rodar e teste no navegador, verá que está funcionando perfeitamente!

Apenas um
Apenas um

E com isso terminamos a pesquisa por cliente.

Parte 6: Excluindo um cliente

Para excluir um cliente vamos fazer um processo parecido com o de pesquisar um cliente, no entanto, mudaremos o verbo HTTP de GET para DELETE, como manda o protocolo. Adicione a nova rota logo após as demais:

Note que desta vez o parâmetro id na URL não é opcional (não usei ? após :id). E dentro do processamento da requisição delete do router eu mando um SQL de DELETE passando o ID numérico.

Para testar essa rota você tem duas alternativas, ou usa o POSTMAN para forjar um DELETE, como abaixo:

DELETE com POSTMAN
DELETE com POSTMAN

Ou fazer via console usando cURL (se tiver ele instalado na sua máquina):

Em ambos os casos você deve obter uma resposta 200 OK (caso não tenha dado erro) e se mandar listar todos clientes novamente, verá que o número 1 sumiu.

Parte 7: Adicionando um cliente

Agora vamos adicionar um novo cliente com um POST na rota /clientes. Adicione esta nova rota logo abaixo das anteriores.

Nela, eu pego as variáveis que devem vir junto ao POST, faço algumas validações de tamanho (para validações mais profissionais, leia este artigo) e depois junto elas a um comando de INSERT que vai ser executado no banco de dados.

Para testar esse POST, você usar o POSTMAN, como mostrado anteriormente:

POST no POSTMAN
POST no POSTMAN

Se quiser fazer via cURL:

Também podemos permitir outras maneiras de passar os dados com a requisição POST, como através de JSON ou através da URL, mas isso foge do escopo deste artigo que deve focar mais no CRUD com SQL Server + Node.

Se testar agora vai ver que é possível inserir novos registros no banco de dados através de requisições POST.

Parte 8: Atualizando um cliente

E para finalizar o CRUD, vamos ver como podemos atualizar um cliente no banco de dados SQL Server através da nossa API Node.js. Para fazer updates podemos usar os verbos PUT ou PATCH. O protocolo diz que devemos usar PUT se pretendemos passar todos os parâmetros da entidade que está sendo atualizada, mas não vamos alterar jamais o ID, então usaremos PATCH nesta API.

Crie uma rota PATCH em /clientes esperando o ID do cliente a ser alterado.

No código acima, pegamos o ID que veio na URL e as demais informações que vieram no corpo da requisição, fazendo as mesmas validações que já havia feito antes (podemos melhorar a segurança aqui). Depois monto o UPDATE com as variáveis locais e mando para nossa função de executar SQL.

Para testar uma requisição PATCH, você pode usar o POSTMAN:

PATCH no POSTMAN
PATCH no POSTMAN

Ou o cURL:

O resultado é o mesmo: o cliente cujo ID=4 vai ter o seu nome alterado para ‘fernando’. Note que se ele não existir, ocasionará um erro que será apresentado no corpo da resposta.

E com isso finalizamos o CRUD da nossa API Node.js que usa SQL Server como persistência de dados.

Bônus 1: Executando muitas operações SQL

Ao contrário dos bancos não-relacionais que estamos acostumados a usar com Node.js, o SQL Server leva mais a sério a escrita dos dados e o faz de maneira síncrona e um tanto lenta para uma plataforma veloz como o Node.js. Isso faz com que, se você for executar um loop de comandos no banco de dados, provavelmente vai dar erro pois o banco não conseguirá responder apropriadamente a uma enxurrada de requisições da sua aplicação Node.

Para resolver isso eu costumo encadear as execuções uma a uma, simulando uma execução assíncrona através de chamadas recursivas, como no exemplo abaixo:

Neste exemplo eu possuía um array de itens que eram endereços de email que eu queria excluir do banco de dados. O i passado por parâmetro inicialmente é 0, quando chamarmos esta função a primeira vez e depois vai sendo incrementado recursivamente. Já o objeto conn é a conexão do banco de dados, que você pode omitir se estiver usando ela global.

O primeiro if do código garante a condição de parada da recursão e o catch na promise da query te contará se houver algum erro. Nada muito rebuscado, mas me foi bem útil!

Bônus 2: ORM

Se você não curte muito a ideia de ficar usando SQL no meio dos seus códigos JS, experimente usar alguma biblioteca ORM (Object-Relational Mapping) como o Sequelize. Nunca usei, mas muita gente recomenda por possuir suporte a MySQL, SQL Server, PostgreSQL e SQLite.

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!

ASP.NET + SQL Server para os alunos do Dom Feliciano

Nesta última segunda-feira (30/05/11) encerramos a 1ª edição do Treinamento em ASP.NET na instituição de Ensino Técnico Dom Feliciano, em Gravataí. O curso, que transcorreu durante todo o mês de maio, capacitou 11 alunos nas tecnologias ASP.NET 4.0 e SQL Server 2008 R2, aumentando sua empregabilidade e ampliando os horizontes dos alunos para técnicas e tecnologias de desenvolvimento em alta no mercado. A parceria firmada entre a RedeHost (representada por mim) e entre a instituição (representada pela prof. Andreza Lorenski) foi fundamental para o desenrolar do curso e até mesmo para abrirmos um leque de novas possibilidades, como os cursos de Linux e de Virtualização que os profissionais de Infraestrutura da RedeHost estão montando.

Alunos Dom Feliciano

Obviamente todo o cronograma foi seguido, com a tradicional palestra de Lavagem Cerebral para inúmeras turmas do referido curso, onde reforço a marca da empresa e lhes apresento nossas oportunidades de carreiras. Em seguida vem a prova de lógica, onde testamos o raciocínio dos inscritos para o curso e selecionamos apenas os alunos com o pensamento mais afiado, pré-requisito fundamental para quem deseja seguir na carreira de software. A turma mesmo custa a se formar, mas quando o curso inicia, não se consegue mais descansar entre uma aula do técnico e outra do curso de extensão.

Para evitar problemas de configuração errônea, velocidade de replicação dos softwares e até mesmo segurança, pela primeira vez fora da RedeHost foram usadas técnicas de virtualização das máquinas do treinamento, onde instalei e configurei uma máquina virtual Windows com os softwares necessários ao curso (Visual Studio 2010 Express e SQL Server 2008 R2 Express) e a repliquei a todas as máquinas de um excelente laboratório da instituição. Desta forma, em apenas uma manhã deixamos o laboratório 100% operacional para atender Às exigências técnicas do curso. O modelo funcionou de forma tão boa que repliquei a prática na 1ª edição do curso que iniciei semana passada na Faculdade Dom Bosco, de Porto Alegre, e devo repetir a dose na escola técnica Alcides Maya em breve, também em Porto Alegre.

Parabéns aos alunos que concluíram o curso com êxito. Para mim e para a família RedeHost, a escola Dom Feliciano sempre foi nossa parceria, uma vez que hoje 17% de nosso pessoal foi ou é aluno da referida instituição no curso Técnico em Informática. Fora os meus colegas que cursaram o ensino regular por lá. Durante esta semana alguns alunos foram entrevistados, seja por e-mail ou pessoalmente. Outros estão terminando seus trabalhos finais do curso. A parte mais difícil para os alunos que querem uma vaga de estágio na RedeHost é agora, quando tem que botar seu conhecimento à prova em nosso rigoroso processo seletivo. Mas tenho fé de que o talento e a garra irão sobrepujar a insegurança e a inexperiência desses jovens que ainda tem um longo caminho a percorrer dentro da informática.

Ah, em breve terei a honra de fazer parte de uma matéria do jornal da instituição, onde comento sobre o curso e ainda poso em uma foto com os alunos, hehehehe.

Treinamento em ASP.NET e SQL Server na Facensa

Boa tarde aos incríveis 7 leitores do blog. Seguindo meu cronograma mental de posts, hoje eu venho falar da minha experiência como instrutor na instituição Facensa, a Faculdade Cenecista Nossa Senhora dos Anjos em Gravataí. Ou a “Faculdade do Gensa” como o pessoal da região costuma chamar. Graças à indicação de meu colega Cristiano “Mato-Fino” Diedrich (esses caras do software livre adoram apelidos estranhos…) entrei em contato com o Prof. Ms. Marcelo Batista, um dos maiores entusiastas em tecnologia e educação que tive o prazer de conhecer em Gravataí. E assim começou uma parceria bem maior do que esperávamos enquanto empresa.

Case Facensa: janeiro de 2011

Sim, isso mesmo. O treinamento na Facensa foi em plena férias de verão. Quem acha que isso foi maldade com os alunos levanta a mão! Na verdade as negociações para o treinamento surgiram antes, mas como o calendário se sobrepunha ao do treinamento da FAQI e eu sou um só, tivemos de adiar. Obviamente não pulamos nenhuma etapa, tendo realizado nossa palestra sobre a RedeHost ainda em 2010 em meio a um simpósio (é essa a palavra?) de computação na própria Facensa para em seguida marcarmos o dia da famigerada prova de lógica, agora em sua versão 1.1.

Entre os que passaram na prova, tive o prazer de lecionar meu “cursinho” para 14 alunos da instituição, que, embora a nota de corte fosse 5 na prova, obtiveram média geral 7, o que considero uma ótima nota conhecendo a prova que aplico. Os encontros dessa vez foram em outro formato, ao invés de uma aula semanal, tínhamos aula todas segundas e sextas-feiras em um excelente laboratório da universidade (ok, o teclado era no mínimo estranho) com exercícios práticos como “tema de casa” durante a semana. Entre mortos e feridos, cada um com seus problemas, terminamos o curso com 9 alunos, em sua maioria devidamente preparados para o mercado de desenvolvimento ASP.NET.

Treinamento ASP.NET Facensa

Resultados

Como obviamente meus treinamentos não são apenas pelo prazer de lecionar (embora isso ajude bastante) sou obrigado a mostrar resultados para minha chefia. Dessa vez consegui uma excelente contratação que prefiro manter anônima embora o Prof. Marcelo adore usá-lo como “case de sucesso” da parceria RedeHost-Facensa e fazê-lo passar vergonha em plena aula mostrando a todos quem ele é, hehehehehehe. Acima tem uma foto tirada no primeiro dia de aula, e apesar de eu estar parecendo um abobado falando sozinho, é a melhor foto dentre as que o CPD da Facensa me conseguiu…fazer o quê, sou programador e não modelo XD

Conclusão

A Facensa e a RedeHost firmaram parcerias que já renderam alguns frutos e muitas outras novidades ainda virão. O Prof. Marcelo e nosso CEO, Flávio Cardoso, tem muitos planos envolvendo pesquisa e fomento de tecnologias que serão úteis à RedeHost e à própria comunidade gravataiense em geral. É esperar para ver. Eu mesmo mantenho contato constante com o Prof. Marcelo, uma vez que ingressei no Mestrado e futuramente espero me tornar um professor de verdade. Afinal sempre é bom ter um mentor mais experiente lhe ajudando a seguir o caminho certo. E já temos a idéia de repetir a dose na própria instituição: em julho de 2011, em plena férias de julho, faremos com que mais uma turma de alunos não possa se divertir nas férias. Uhu! Interessados já podem começar a incomodar o prof. desde agora. Em breve mais novidades sobre os próximos treinamentos!