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.