Back-End

19 fev, 2019

Restify e Sequelize com Node.js – Parte 02

Publicidade

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.