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
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
Copiar e Colar do LivrosRepository
Encontrar e Substituir ;)
Copiar e Colar do livros.js
Encontrar e Substituir ;)
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
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

Node JS - Parte 4

  • 1.
  • 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.
  • 4.
  • 5.
    Exemplo com Função nodesrcindex2.js 0 1 2
  • 6.
    E por queessa 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 • Vamoscriar 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 Colardo LivrosRepository Encontrar e Substituir ;)
  • 17.
    Copiar e Colardo livros.js Encontrar e Substituir ;)
  • 20.
    Problema ! • Nossosistema 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 usaro 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
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
    SQL Injection • Essecó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
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.