Nesta continuação da série iremos trabalhar com o pacote do Sequelize, que nada mais é que um Framework ORM voltado para banco de dados relacional.
O mesmo facilita a conexão entre nossa aplicação e o banco de dados, já com alguns comandos prontos, e é claro, deixando nosso ambiente de desenvolvimento mais organizado e produtivo. A primeira parte da série está disponível neste link.
A documentação do Framework pode ser acessada em:
Primeiro, para instalar o pacote abra o terminal e execute “npm install — save sequelize
”. Logo após a instalação precisaremos instalar também o client do banco de dados a ser utilizado.
Neste momento você pode optar pelos bancos: MySQL, PostgreSQL, SqlLite, e MSSQL (SQL Server). Vou utilizar nos exemplos o MySQL. Sendo assim, execute no seu terminal o client que escolher:
npm install — save pg pg-hstore
npm install — save mysql2
npm install — save sqlite3
npm install — save tedious // MSSQL
Após a instalação criaremos um arquivo dentro da pasta config com o nome “db.js”, que irá conter as configurações de conexões do nosso banco de dados:
Onde inicializamos o Sequelize(new Sequelize), os parâmetros a serem passados, são: Nome da base, usuário, senha, host, porta e o client que será utilizado.
Para cada banco de dados, as configurações podem ser um pouco diferentes, como no caso do SQLite. Então, confira na documentação do Sequelize:
MODELS:
As models, nada mais são que a visão/estrutura das nossas tabelas dentro do banco de dados. Isso facilita, pois o Sequelize cria as queries automaticamente baseado nas models que desenhamos. Fornece também comandos, pré-definidos como insert, delete, update dos atributos que só queremos alterar e select mais complexos.
Ao lado, perceba que invocamos nossa configuração de base de dados e também criamos uma constante que servirá para definir os types dos attributes. O método “db.define()” é onde colocamos o nome da tabela que conectaremos logo após seus respectivos atributos.
A chave primária da tabela é referenciada com um objeto chamado “primaryKey”. Assim, se tivéssemos mais PK, poderíamos informar da mesma forma. O script de criação do banco de dados está no meu GitHub.
Para buscar os dados da tabela de pessoas, criaremos uma pasta na raiz do nosso projeto chamada “services”, e dentro, o arquivo “pessoas.js”. Como o Node.js trabalha de forma assíncrona, teremos que esperar o retorno da consulta utilizando “Promise”.
Importamos nossa Model de pessoas no projeto e executamos o método do Sequelize “findAll()” . O mesmo retornará todos os registros de nossa tabela. É possível explorar mais comandos na documentação:
Configurando as rotas com o Restify
No início do nosso projeto, dentro do arquivo “server.js”, criamos uma rota que retornava um objeto qualquer, com o método get. Agora, para melhor organização da nossa aplicação iremos reestruturar as formas de busca das rotas da seguinte maneira:
Criamos uma pasta chamada “routes” e dentro criamos dois arquivos “routes.js” e “routerPessoas.js”. Dentro do arquivo “routerPessoas.js” importaremos as configurações no nosso servidor Restify, baseando em uma constante chamada “router”, e no final a exportamos.
No arquivo “router.js” importamos as rotas das pessoas, ou seja, neste arquivo vamos centralizar e criar uma coleção de rotas e em seguida as exportamos.
No arquivo “server.js” iremos retirar a rota inicial que tínhamos criado e o método de inicialização do nosso servidor “server.listen()“ – iremos migrar para o arquivo “index.js”. No “exports” vamos exportar a variável do nosso servidor e da nossa porta:
No arquivo “index.js” importaremos as configurações do nosso servidor e porta, como também nosso arquivo de rotas. Dentro do método “listen()”, onde é criado/inicializado de fato o server, incluímos nossa variável “router”.
Testando no navegador o resultado deve ser igual a imagem ao lado.
Executando a busca na base de dados:
Para importar o método de consulta do arquivo “services.js”, basta importar e invocá-lo a partir da variável “services”, não necessariamente precisa ser este nome. Logo após a chamada da função, executamos o método “then(data)”, que faz um “callback” de sucesso, que nossa promise executou (Resolve) da resposta.
Ou seja, ele aguarda a promise terminar e nos retorna os dados na variável chamada “data”, caso houver sucesso. Dessa forma retornamos os dados ao nosso navegador com o status 200, OK.
Caso contrário (Rejected), houve uma falha e é executado o “catch(err)”, que recebe a rejeição da nossa promise e retornamos a requisição de erro 503 ao nosso navegador, informando que houve um erro interno.
Em caso de sucesso (200), o navegador exibirá nossos dados. Para isto, cadastre algumas pessoas no banco.
O código desta segunda parte e o banco de dados (db_contatos.sql), podem ser encontrados em meu GitHub:
Na próxima parte trabalharemos o conceito de CRUD, utilizando headers e paginando os retornos das consultas com o PostMan. Fechando, assim, o ciclo da entidade de pessoas.