SlideShare uma empresa Scribd logo
1 de 40
Baixar para ler offline
Persistência em Node.js
Arquivos e MySQL
Bruno Catão
Projeto da Aula
• Nessa aula continuaremos o projeto desenvolvido nas duas aulas
anteriores
• Nós vamos implementar a camada de persistência com:
• Arquivos
• Banco de Dados Relacionais
• MySQL (SQL e ORM)
• Banco de Dados Não Relacionais
• MongoDB (API e Mongoose)
Algo Sobre Módulos
• Quando um módulo é importado, seu conteúdo é guardado em cache
• Exemplo 1 – Exportando um objeto (singleton):
let contador = 0;
module.exports = {contador: contador++};
• Em cada uso o valor do contador vai ser o mesmo.
• Exemplo 2 – Exportando uma função (nova instância por import):
let contador = 0;
module.exports = () => {return {contador: contador++}};
• Em cada uso o valor do contador vai ser incrementado.
Exemplo Singleton
node srcindex2.js
0 0 0
Exemplo com Função
node srcindex2.js
0 1 2
E por que essa mudança de assunto ?
• É para a gente entender os módulos de persistência
• Já que um módulo é carregado apenas uma vez, nós podemos:
• Colocar código de inicialização
• Podemos guardar estado em um módulo:
• Esse estado será compartilhado em qualquer local do projeto
• É possível criar um módulo de constantes, valores globais, etc
Persistência em Arquivos
fs.readFile, fs.writeFile, JSON.parse, JSON.stringify
Node JS - Parte 4
Node JS - Parte 4
Node JS - Parte 4
Node JS - Parte 4
Node JS - Parte 4
Próximos Passos
• Vamos criar um script: repositores/UsuarioRepository.js
• Com as funções para armazenar e recuperar usuários
• Vamos criar outro script: controllers/usuários.js
• Com os endpoints para criar usuários
• Antes de tudo !
• Já que vamos armazenar os dados dos usuários, é bom evitar a duplicação de
código
• Então, vamos criar um script util/persistencia.js
• Vamos modificar o script repositories/LivrosRepository.js
Node JS - Parte 4
Node JS - Parte 4
Copiar e Colar do LivrosRepository
Encontrar e Substituir ;)
Copiar e Colar do livros.js
Encontrar e Substituir ;)
Node JS - Parte 4
Node JS - Parte 4
Problema !
• Nosso sistema está armazenando as senhas não criptografadas !
• Isso é muito grave
• Apenas o hash da senha é que deve ser armazenado
• Hash é uma função não reversível
• h(x) = y  h-1(y) ≠ x
• Ou seja, se alguém invadir o servidor e acessar o banco de dados, não
é possível descobrir quais são as senhas
• Sistemas que, quando você diz que esqueceu a senha, ele te envia a
senha descriptografada, são sistemas com a segurança muito ruim
Solução
• Vamos usar o pacote bcrypt
• Para instalar: npm i --save bcrypt
• Antes de armazenar a senha nós a encriptamos (guarda o hash)
• Quando formos fazer o login, nós encriptamos a senha entrada e a
comparamos com a senha armazenada (hash)
• Vamos adicionar algumas funções no módulo util/seguranca.js
Node JS - Parte 4
Node JS - Parte 4
Node JS - Parte 4
Node JS - Parte 4
Node JS - Parte 4
Node JS - Parte 4
Persistência com MySQL
• Pacote mysql
• npm i --save mysql
Criando Tabelas
Inserindo Valores
Executando Consultas
Retornando uma consulta com o Express
SQL Injection
• Esse código é horrível:
• Esse é muito melhor:
ORM - Sequelize
• ORM, estilo Hibernate, para Node.js
• Instalação:
• npm install --save sequelize
• npm install --save pg pg-hstore // PostgreSQL
• npm install --save mysql2 // MySQL
• npm install --save sqlite3 // Sqlite
• npm install --save tedious // Microsoft SQL Server
Sequelize
• Abrindo uma conexão:
Sequelize
• Definindo um modelo:
Create
Consulta
Consulta
Destroy e Update

Mais conteúdo relacionado

Mais procurados

Opennebula instalação
Opennebula instalaçãoOpennebula instalação
Opennebula instalaçãoLuís Eduardo
 
1º Meetup Zabbix Meetup do Recife: Francys Nivea - LLD ODBC
1º Meetup Zabbix Meetup do Recife: Francys Nivea - LLD ODBC1º Meetup Zabbix Meetup do Recife: Francys Nivea - LLD ODBC
1º Meetup Zabbix Meetup do Recife: Francys Nivea - LLD ODBCZabbix BR
 
De A a Zabbix Devry Metrocamp
De A a Zabbix Devry MetrocampDe A a Zabbix Devry Metrocamp
De A a Zabbix Devry MetrocampAndré Déo
 
UserParameter vs Zabbix Sender - 1º ZABBIX MEETUP DO INTERIOR-SP
UserParameter vs Zabbix Sender - 1º ZABBIX MEETUP DO INTERIOR-SPUserParameter vs Zabbix Sender - 1º ZABBIX MEETUP DO INTERIOR-SP
UserParameter vs Zabbix Sender - 1º ZABBIX MEETUP DO INTERIOR-SPAndré Déo
 
Apresentação PGDAY - instalação e configuração - PostgreSQL
Apresentação PGDAY - instalação e configuração - PostgreSQLApresentação PGDAY - instalação e configuração - PostgreSQL
Apresentação PGDAY - instalação e configuração - PostgreSQLJohnes Castro
 
Vagrant vs docker? Melhor vagrant + docker
Vagrant vs docker? Melhor vagrant + dockerVagrant vs docker? Melhor vagrant + docker
Vagrant vs docker? Melhor vagrant + dockerWellington Silva
 
Zabbix e SNMP - Zabbix Conference LatAm - André Déo
Zabbix e SNMP - Zabbix Conference LatAm - André DéoZabbix e SNMP - Zabbix Conference LatAm - André Déo
Zabbix e SNMP - Zabbix Conference LatAm - André DéoAndré Déo
 
Criando um Website Cacheavel
Criando um Website CacheavelCriando um Website Cacheavel
Criando um Website CacheavelLucas Brasilino
 
1º Meetup Zabbix Meetup do Recife: Danilo Barros - Zabbix dicas e truques par...
1º Meetup Zabbix Meetup do Recife: Danilo Barros - Zabbix dicas e truques par...1º Meetup Zabbix Meetup do Recife: Danilo Barros - Zabbix dicas e truques par...
1º Meetup Zabbix Meetup do Recife: Danilo Barros - Zabbix dicas e truques par...Zabbix BR
 
Containers PostgreSQL com a Crunchy Container Suite
Containers PostgreSQL com a Crunchy Container SuiteContainers PostgreSQL com a Crunchy Container Suite
Containers PostgreSQL com a Crunchy Container SuiteRoberto Mello
 
Iseltech13 – Node.Js Like a Star Wars episode
Iseltech13 –  Node.Js Like a Star Wars episodeIseltech13 –  Node.Js Like a Star Wars episode
Iseltech13 – Node.Js Like a Star Wars episodeNuno Paz
 
TDC2010 - Trilha Python: Python no iG (Automação de Datacenters)
TDC2010 - Trilha Python: Python no iG (Automação de Datacenters)TDC2010 - Trilha Python: Python no iG (Automação de Datacenters)
TDC2010 - Trilha Python: Python no iG (Automação de Datacenters) iG - Internet Group do Brasil S/A
 
MEO Cloud - Python Lisbon Meetup
MEO Cloud - Python Lisbon MeetupMEO Cloud - Python Lisbon Meetup
MEO Cloud - Python Lisbon MeetupAndré Cruz
 
Instalando nx server no ubuntu 9_10
Instalando nx server no ubuntu 9_10Instalando nx server no ubuntu 9_10
Instalando nx server no ubuntu 9_10limafricke
 
Sistemas operacionais1
Sistemas operacionais1Sistemas operacionais1
Sistemas operacionais1Nauber Gois
 

Mais procurados (20)

Opennebula instalação
Opennebula instalaçãoOpennebula instalação
Opennebula instalação
 
1º Meetup Zabbix Meetup do Recife: Francys Nivea - LLD ODBC
1º Meetup Zabbix Meetup do Recife: Francys Nivea - LLD ODBC1º Meetup Zabbix Meetup do Recife: Francys Nivea - LLD ODBC
1º Meetup Zabbix Meetup do Recife: Francys Nivea - LLD ODBC
 
Vagrant + Puppet
Vagrant + PuppetVagrant + Puppet
Vagrant + Puppet
 
De A a Zabbix Devry Metrocamp
De A a Zabbix Devry MetrocampDe A a Zabbix Devry Metrocamp
De A a Zabbix Devry Metrocamp
 
UserParameter vs Zabbix Sender - 1º ZABBIX MEETUP DO INTERIOR-SP
UserParameter vs Zabbix Sender - 1º ZABBIX MEETUP DO INTERIOR-SPUserParameter vs Zabbix Sender - 1º ZABBIX MEETUP DO INTERIOR-SP
UserParameter vs Zabbix Sender - 1º ZABBIX MEETUP DO INTERIOR-SP
 
Apresentação PGDAY - instalação e configuração - PostgreSQL
Apresentação PGDAY - instalação e configuração - PostgreSQLApresentação PGDAY - instalação e configuração - PostgreSQL
Apresentação PGDAY - instalação e configuração - PostgreSQL
 
Vagrant vs docker? Melhor vagrant + docker
Vagrant vs docker? Melhor vagrant + dockerVagrant vs docker? Melhor vagrant + docker
Vagrant vs docker? Melhor vagrant + docker
 
Realtime com node.js e socket.io
Realtime com node.js e socket.ioRealtime com node.js e socket.io
Realtime com node.js e socket.io
 
Zabbix e SNMP - Zabbix Conference LatAm - André Déo
Zabbix e SNMP - Zabbix Conference LatAm - André DéoZabbix e SNMP - Zabbix Conference LatAm - André Déo
Zabbix e SNMP - Zabbix Conference LatAm - André Déo
 
Criando um Website Cacheavel
Criando um Website CacheavelCriando um Website Cacheavel
Criando um Website Cacheavel
 
1º Meetup Zabbix Meetup do Recife: Danilo Barros - Zabbix dicas e truques par...
1º Meetup Zabbix Meetup do Recife: Danilo Barros - Zabbix dicas e truques par...1º Meetup Zabbix Meetup do Recife: Danilo Barros - Zabbix dicas e truques par...
1º Meetup Zabbix Meetup do Recife: Danilo Barros - Zabbix dicas e truques par...
 
Containers PostgreSQL com a Crunchy Container Suite
Containers PostgreSQL com a Crunchy Container SuiteContainers PostgreSQL com a Crunchy Container Suite
Containers PostgreSQL com a Crunchy Container Suite
 
DevOps Braga #5
DevOps Braga #5DevOps Braga #5
DevOps Braga #5
 
Iseltech13 – Node.Js Like a Star Wars episode
Iseltech13 –  Node.Js Like a Star Wars episodeIseltech13 –  Node.Js Like a Star Wars episode
Iseltech13 – Node.Js Like a Star Wars episode
 
TDC2010 - Trilha Python: Python no iG (Automação de Datacenters)
TDC2010 - Trilha Python: Python no iG (Automação de Datacenters)TDC2010 - Trilha Python: Python no iG (Automação de Datacenters)
TDC2010 - Trilha Python: Python no iG (Automação de Datacenters)
 
Docker + Django
Docker + DjangoDocker + Django
Docker + Django
 
MEO Cloud - Python Lisbon Meetup
MEO Cloud - Python Lisbon MeetupMEO Cloud - Python Lisbon Meetup
MEO Cloud - Python Lisbon Meetup
 
Apresentação do Novo QTS 4.2
Apresentação do Novo QTS 4.2Apresentação do Novo QTS 4.2
Apresentação do Novo QTS 4.2
 
Instalando nx server no ubuntu 9_10
Instalando nx server no ubuntu 9_10Instalando nx server no ubuntu 9_10
Instalando nx server no ubuntu 9_10
 
Sistemas operacionais1
Sistemas operacionais1Sistemas operacionais1
Sistemas operacionais1
 

Semelhante a Node JS - Parte 4

AWS Meetup - Processando dados em alta escala com Node.js e AWS Lambda
AWS Meetup - Processando dados em alta escala com Node.js e AWS LambdaAWS Meetup - Processando dados em alta escala com Node.js e AWS Lambda
AWS Meetup - Processando dados em alta escala com Node.js e AWS LambdaDaniel Baptista Dias
 
Trabalhando com Threads em JAVA
Trabalhando com Threads em JAVATrabalhando com Threads em JAVA
Trabalhando com Threads em JAVAMarcio Palheta
 
Arquitetura IMGD da Plataforma de Integração Magic xpi 4 - Magic Sem Segredos...
Arquitetura IMGD da Plataforma de Integração Magic xpi 4 - Magic Sem Segredos...Arquitetura IMGD da Plataforma de Integração Magic xpi 4 - Magic Sem Segredos...
Arquitetura IMGD da Plataforma de Integração Magic xpi 4 - Magic Sem Segredos...Magic Software Brasil
 
TDC - Processamento de dados em alta escala com Node.js e AWS Lambda
TDC - Processamento de dados em alta escala com Node.js e AWS LambdaTDC - Processamento de dados em alta escala com Node.js e AWS Lambda
TDC - Processamento de dados em alta escala com Node.js e AWS LambdaDaniel Baptista Dias
 
TDC2017 | São Paulo - Trilha NODEJS How we figured out we had a SRE team at -...
TDC2017 | São Paulo - Trilha NODEJS How we figured out we had a SRE team at -...TDC2017 | São Paulo - Trilha NODEJS How we figured out we had a SRE team at -...
TDC2017 | São Paulo - Trilha NODEJS How we figured out we had a SRE team at -...tdc-globalcode
 
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeçaTrês anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeçaFelipe Hummel
 
Docker + Kubernetes (devOps)
Docker + Kubernetes (devOps)Docker + Kubernetes (devOps)
Docker + Kubernetes (devOps)Andre Straube
 
Projeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecordProjeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecordtchandy
 
Design Patterns on Rails
Design Patterns on RailsDesign Patterns on Rails
Design Patterns on Railstchandy
 
Python - Programando em alto nível
Python - Programando em alto nívelPython - Programando em alto nível
Python - Programando em alto nívelIgor Sobreira
 
Mongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopMongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopDiego Sana
 
Slide Aula - Curso CakePHP
Slide Aula - Curso CakePHPSlide Aula - Curso CakePHP
Slide Aula - Curso CakePHPRangel Javier
 
PHP Aula 06 - Include, Require e Querystring
PHP Aula 06 - Include, Require e QuerystringPHP Aula 06 - Include, Require e Querystring
PHP Aula 06 - Include, Require e QuerystringDaniel Brandão
 
Gerenciamento de Memória
Gerenciamento de MemóriaGerenciamento de Memória
Gerenciamento de MemóriaCDS
 
Linguagem de Programação Java para Iniciantes
Linguagem de Programação Java para IniciantesLinguagem de Programação Java para Iniciantes
Linguagem de Programação Java para IniciantesOziel Moreira Neto
 

Semelhante a Node JS - Parte 4 (20)

AWS Meetup - Processando dados em alta escala com Node.js e AWS Lambda
AWS Meetup - Processando dados em alta escala com Node.js e AWS LambdaAWS Meetup - Processando dados em alta escala com Node.js e AWS Lambda
AWS Meetup - Processando dados em alta escala com Node.js e AWS Lambda
 
Trabalhando com Threads em JAVA
Trabalhando com Threads em JAVATrabalhando com Threads em JAVA
Trabalhando com Threads em JAVA
 
Arquitetura IMGD da Plataforma de Integração Magic xpi 4 - Magic Sem Segredos...
Arquitetura IMGD da Plataforma de Integração Magic xpi 4 - Magic Sem Segredos...Arquitetura IMGD da Plataforma de Integração Magic xpi 4 - Magic Sem Segredos...
Arquitetura IMGD da Plataforma de Integração Magic xpi 4 - Magic Sem Segredos...
 
Apresentação do Curso
Apresentação do CursoApresentação do Curso
Apresentação do Curso
 
TDC - Processamento de dados em alta escala com Node.js e AWS Lambda
TDC - Processamento de dados em alta escala com Node.js e AWS LambdaTDC - Processamento de dados em alta escala com Node.js e AWS Lambda
TDC - Processamento de dados em alta escala com Node.js e AWS Lambda
 
TDC2017 | São Paulo - Trilha NODEJS How we figured out we had a SRE team at -...
TDC2017 | São Paulo - Trilha NODEJS How we figured out we had a SRE team at -...TDC2017 | São Paulo - Trilha NODEJS How we figured out we had a SRE team at -...
TDC2017 | São Paulo - Trilha NODEJS How we figured out we had a SRE team at -...
 
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeçaTrês anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeça
 
Docker + Kubernetes (devOps)
Docker + Kubernetes (devOps)Docker + Kubernetes (devOps)
Docker + Kubernetes (devOps)
 
Projeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecordProjeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecord
 
Mean Stack
Mean StackMean Stack
Mean Stack
 
Design Patterns on Rails
Design Patterns on RailsDesign Patterns on Rails
Design Patterns on Rails
 
Aula7ArquivosDB.ppt
Aula7ArquivosDB.pptAula7ArquivosDB.ppt
Aula7ArquivosDB.ppt
 
Python - Programando em alto nível
Python - Programando em alto nívelPython - Programando em alto nível
Python - Programando em alto nível
 
Curso de ReactJS
Curso de ReactJSCurso de ReactJS
Curso de ReactJS
 
Mongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopMongo Db - PHP Day Workshop
Mongo Db - PHP Day Workshop
 
Slide Aula - Curso CakePHP
Slide Aula - Curso CakePHPSlide Aula - Curso CakePHP
Slide Aula - Curso CakePHP
 
PHP Aula 06 - Include, Require e Querystring
PHP Aula 06 - Include, Require e QuerystringPHP Aula 06 - Include, Require e Querystring
PHP Aula 06 - Include, Require e Querystring
 
Gerenciamento de Memória
Gerenciamento de MemóriaGerenciamento de Memória
Gerenciamento de Memória
 
Linguagem de Programação Java para Iniciantes
Linguagem de Programação Java para IniciantesLinguagem de Programação Java para Iniciantes
Linguagem de Programação Java para Iniciantes
 
Framework Yii
Framework YiiFramework Yii
Framework Yii
 

Mais de Bruno Catão

Introdução às Redes Neurais - Parte 2/2
Introdução às Redes Neurais - Parte 2/2Introdução às Redes Neurais - Parte 2/2
Introdução às Redes Neurais - Parte 2/2Bruno Catão
 
Introdução às Redes Neurais - Parte 1/2
Introdução às Redes Neurais - Parte 1/2Introdução às Redes Neurais - Parte 1/2
Introdução às Redes Neurais - Parte 1/2Bruno Catão
 
React JS - Parte 2
React JS - Parte 2React JS - Parte 2
React JS - Parte 2Bruno Catão
 
React JS - Parte 1
React JS - Parte 1React JS - Parte 1
React JS - Parte 1Bruno Catão
 
Ionic 2/3 + Firebase
Ionic 2/3 + FirebaseIonic 2/3 + Firebase
Ionic 2/3 + FirebaseBruno Catão
 
Retina e Retinose Pigmentar
Retina e Retinose PigmentarRetina e Retinose Pigmentar
Retina e Retinose PigmentarBruno Catão
 
Introdução à MEAN Stack
Introdução à MEAN StackIntrodução à MEAN Stack
Introdução à MEAN StackBruno Catão
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScriptBruno Catão
 
Unity3d Space Shooter (Parte 1)
Unity3d Space Shooter (Parte 1)Unity3d Space Shooter (Parte 1)
Unity3d Space Shooter (Parte 1)Bruno Catão
 
Introdução ao Framework Grails
Introdução ao Framework GrailsIntrodução ao Framework Grails
Introdução ao Framework GrailsBruno Catão
 

Mais de Bruno Catão (20)

Introdução às Redes Neurais - Parte 2/2
Introdução às Redes Neurais - Parte 2/2Introdução às Redes Neurais - Parte 2/2
Introdução às Redes Neurais - Parte 2/2
 
Introdução às Redes Neurais - Parte 1/2
Introdução às Redes Neurais - Parte 1/2Introdução às Redes Neurais - Parte 1/2
Introdução às Redes Neurais - Parte 1/2
 
React JS - Parte 2
React JS - Parte 2React JS - Parte 2
React JS - Parte 2
 
React JS - Parte 1
React JS - Parte 1React JS - Parte 1
React JS - Parte 1
 
Ionic 2/3 + Firebase
Ionic 2/3 + FirebaseIonic 2/3 + Firebase
Ionic 2/3 + Firebase
 
Retina e Retinose Pigmentar
Retina e Retinose PigmentarRetina e Retinose Pigmentar
Retina e Retinose Pigmentar
 
Angular js
Angular jsAngular js
Angular js
 
Introdução à MEAN Stack
Introdução à MEAN StackIntrodução à MEAN Stack
Introdução à MEAN Stack
 
Web Offline
Web OfflineWeb Offline
Web Offline
 
Python 08
Python 08Python 08
Python 08
 
Python 07
Python 07Python 07
Python 07
 
Python 06
Python 06Python 06
Python 06
 
Python 05
Python 05Python 05
Python 05
 
Python 04
Python 04Python 04
Python 04
 
Python 03
Python 03Python 03
Python 03
 
Python 02
Python 02Python 02
Python 02
 
Python 01
Python 01Python 01
Python 01
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
Unity3d Space Shooter (Parte 1)
Unity3d Space Shooter (Parte 1)Unity3d Space Shooter (Parte 1)
Unity3d Space Shooter (Parte 1)
 
Introdução ao Framework Grails
Introdução ao Framework GrailsIntrodução ao Framework Grails
Introdução ao Framework Grails
 

Node JS - Parte 4

  • 1. Persistência em Node.js Arquivos e MySQL Bruno Catão
  • 2. Projeto da Aula • Nessa aula continuaremos o projeto desenvolvido nas duas aulas anteriores • Nós vamos implementar a camada de persistência com: • Arquivos • Banco de Dados Relacionais • MySQL (SQL e ORM) • Banco de Dados Não Relacionais • MongoDB (API e Mongoose)
  • 3. Algo Sobre Módulos • Quando um módulo é importado, seu conteúdo é guardado em cache • Exemplo 1 – Exportando um objeto (singleton): let contador = 0; module.exports = {contador: contador++}; • Em cada uso o valor do contador vai ser o mesmo. • Exemplo 2 – Exportando uma função (nova instância por import): let contador = 0; module.exports = () => {return {contador: contador++}}; • Em cada uso o valor do contador vai ser incrementado.
  • 5. Exemplo com Função node srcindex2.js 0 1 2
  • 6. E por que essa mudança de assunto ? • É para a gente entender os módulos de persistência • Já que um módulo é carregado apenas uma vez, nós podemos: • Colocar código de inicialização • Podemos guardar estado em um módulo: • Esse estado será compartilhado em qualquer local do projeto • É possível criar um módulo de constantes, valores globais, etc
  • 7. Persistência em Arquivos fs.readFile, fs.writeFile, JSON.parse, JSON.stringify
  • 13. Próximos Passos • Vamos criar um script: repositores/UsuarioRepository.js • Com as funções para armazenar e recuperar usuários • Vamos criar outro script: controllers/usuários.js • Com os endpoints para criar usuários • Antes de tudo ! • Já que vamos armazenar os dados dos usuários, é bom evitar a duplicação de código • Então, vamos criar um script util/persistencia.js • Vamos modificar o script repositories/LivrosRepository.js
  • 16. Copiar e Colar do LivrosRepository Encontrar e Substituir ;)
  • 17. Copiar e Colar do livros.js Encontrar e Substituir ;)
  • 20. Problema ! • Nosso sistema está armazenando as senhas não criptografadas ! • Isso é muito grave • Apenas o hash da senha é que deve ser armazenado • Hash é uma função não reversível • h(x) = y  h-1(y) ≠ x • Ou seja, se alguém invadir o servidor e acessar o banco de dados, não é possível descobrir quais são as senhas • Sistemas que, quando você diz que esqueceu a senha, ele te envia a senha descriptografada, são sistemas com a segurança muito ruim
  • 21. Solução • Vamos usar o pacote bcrypt • Para instalar: npm i --save bcrypt • Antes de armazenar a senha nós a encriptamos (guarda o hash) • Quando formos fazer o login, nós encriptamos a senha entrada e a comparamos com a senha armazenada (hash) • Vamos adicionar algumas funções no módulo util/seguranca.js
  • 28. Persistência com MySQL • Pacote mysql • npm i --save mysql
  • 32. Retornando uma consulta com o Express
  • 33. SQL Injection • Esse código é horrível: • Esse é muito melhor:
  • 34. ORM - Sequelize • ORM, estilo Hibernate, para Node.js • Instalação: • npm install --save sequelize • npm install --save pg pg-hstore // PostgreSQL • npm install --save mysql2 // MySQL • npm install --save sqlite3 // Sqlite • npm install --save tedious // Microsoft SQL Server