Prévia do material em texto
MEAN Stack Parte III - Mongoose Revisão • Databases, Collections e Document – MongoDB não tem tabelas. O banco possui “collections of documents” (coleções de documentos) • As coleções são análogas a tabelas em bancos de dados relacionais e os documentos aos dados. Coleção Coleção Coleção Documento Revisão • Criando um Database e Collections – Se um banco de dados não existir, o MongoDB cria o banco de dados quando se armazena os dados para ele pela primeira vez. (ou seja, quando se cria um coleção com seu documento) – Podemos mudar para um banco de dados inexistente e executar a seguinte operação use myBDuser Banco “myDBuser” Coleção “users” Documento (dados) Revisão • Operação de Leitura – As operações de leitura recuperam documentos de uma coleção • ou seja, consulta uma coleção para “pegar” os documentos. Banco “myDBuser” Coleção “users” Seleciona o campo “age” cujo valor seja maior ou igual 18 (Comparison Query Operators) Apresenta o “name” e o “address” como resultado da consulta Revisão • Operação de Update – As operações de atualização modificam os documentos existentes em uma coleção . • No MongoDB, as operações de update visam uma única coleção. • Todas as operações de escrita no MongoDB são atômicas no nível de um único documento. Coleção “users” Determina o critério de busca do elemento a ser atualizado. Neste caso, “age” menor que “18” Seleciona o campo “status” cujo valor será atualizado Banco “myDBuser” Revisão • Operação de Delete – As operações de delete remove documentos de uma coleção. • No MongoDB, as operações de delete visam uma única coleção. • Todas as operações de escrita no MongoDB são atômicas no nível de um único documento. Banco “myDBuser” Coleção “users” Determina o critério de deleção Neste caso, “status” igual a “reject” • s Revisão Mongoose • Blz... – Nós já temos o nosso MongoDB server OK • E já “brincamos” um pouco com os seus comandos… – Agora podemos trabalhar diretamente com o MongoDB junto com o Node.js – Para isso precisamos instalar e conversar sobre um novo recurso que vai “ajudar a nossa vida”.. Usando o Mongoose para trabalhar com Dados e Modelos • Mas que raios é “Mongoose” – É mais do que um simples “MongoDB client” – É um pacote que também nos permite definir “schemas” e modelos • Por exemplo, o que um “Usuário” deve ter definido: – Nome : String – Idade: Inteiro – etc.. – E criar objetos a partir desse modelo • E uma vez criado é possível executar métodos na database, tais como “save” ou “delete” • De forma que não e necessário escrever “queries na mão” Usando o Mongoose para trabalhar com Dados e Modelos • Mas que raios é “Mongoose” – Também é possível realizar validações extras • Por exemplo, se o dado criado “se encaixa” no modelo criado – Oferece operações intuitivas para manipulação da base de dados Preparando o Projeto • Para usá-lo, precisamos instalar o Mongoose no nosso projeto • Vamos fazer isso usando o “npm install –save mongoose” – O “save” vai atualizar o nosso arquivo “package.json” Preparando o Projeto • Uma vez que o processo de instalação tenha terminado • Podemos ver no “package.json” se ele foi adicionado ao projeto • Como vamos usá-lo.. Usando Mongoose com Node.js • Objetivo: Nós vamos conectar nosso “MongoDB Server” à “aplicação Node.js” usando o “pacote Mongoose” • Vamos começar pelo arquivo “app.js da raiz” – Uma vez que queremos que requisições possam se conectar ao banco Usando Mongoose com Node.js • Com o intuito de conectar as requisições, devemos usar: • Com essa função nós estabelecemos uma conexão • Como parâmetro nós temos – O “path:port” que é o caminho para o “MongoDB Server” – O nome da base de dados que iremos usar. Criando Modelos com Mongoose • Agora podemos executar operações na base de dados – Mas para isso, temos que inicialmente trabalhar com os “modelos” – E com esses modelos, criar objetos baseados neles… – Para finalmente usar esses objetos e acessar a base de dados diretamente…. • E o legal dessa estória é que… – o Mongoose irá criar as coleções apropriadas para nosso modelo e gerenciar nossos dados lá… Criando Modelos com Mongoose • Do lado do servidor vamos criar uma pasta “models” • Dentro dele, vamos criar dois modelos que vamos usar várias vezes ao longo do curso – Vamos criar dois arquivos: “message.js” e “user.js” Criando Modelos com Mongoose • Reforçando… – Nosso foco é criar uma aplicação que tem “Message” e “User” que podem criar mensagens, logar, deslogar, etc.. • Logo precisamos ser capaz de manipular e armazenar mensagens e usuários User Message*1 • Um “User” pode ter várias “Message” MAS • Cada “Message” só pode ter sido criada por um “User” Criando Modelos com Mongoose • Agora como vamos criar os modelos com o Mongoose?? • Precisamos “importar” o Mongoose para o arquivo • Com isso temos acesso a ele • Agora vamos criar uma variável “Schema” a partir de “objeto Schema” do Mongoose • “Schema” é basicamente um “helper object” que permite criar um “projeto” do meu modelo (design) • A partir desse “Schema” eu posso criar o “meu próprio schema” e configurá-lo • O construtor irá receber como argumento o modelo que iremos definir Criando Modelos com Mongoose • Agora como vamos criar os modelos com o Mongoose?? • Estes são os nomes dos campos (“as propriedades”) que serão armazenados no MongoDB • Estas são as definições dos campos (configurações) • A sintaxe é do Mongoose • O “required” quer dizer que tal campo nunca pode ser vazio • “Schema.Types” acessa todos os tipos que o Mongoose conhece • “ObjectId” é o tipo interno que o Mongoose usa para referenciar o ID • O objeto “Message” terá • O “content” como “String” • O “user” como “uma referência” ao objeto usuário que criou a mensagem • Essa referência é modelado como um “ObjectId” Aqui vamos ter o “documents” esquematizado Criando Modelos com Mongoose • Agora que temos um “schema/projeto” podemos efetivar a criação do “modelo” – A gente não pode instanciar esse “schema/projeto” – A gente precisa de um “modelo” para fazer isso • Vamos exportar o modelo por meio do Mongoose • O método “model()” tem 2 argumentos: • O nome do modelo • O “schema” que queremos usar para o modelo • O “nome do modelo” é o que será utilizado para criar uma “Collection” no MongoDB • Em minúsculo e no plural: “messages” • Com esse comando nosso modelo “Message” está configurado e poderemos instancia-lo mais pra frente Criando Modelos com Mongoose • O modelo para “User” seria: • O objeto “User” terá • O “firstName, lastName, password, email” como “String” • O “messages” como “um array de referências” aos objetos mensagem que foram criadas pelo usuário • Essa referência é modelado como um “ObjectId” • O “nome do modelo” é o que será utilizado para criar uma “Collection” no MongoDB • Em minúsculo e no plural: “users” • Com esse comando nosso modelo “User” está configurado e poderemos instancia- lo mais pra frente Criando Modelos com Mongoose • Antes de mais nada.. Uma palavrinha sobre o “unique” • Queremos que o e-mail seja “único” • E apesar de ser uma propriedade reconhecida pelo Mongoose ela não é automaticamente validada – Pode acontecer de ter várias e-mails iguais cadastrados Criando Modelos com Mongoose • Para resolver isso, precisamos instalar uma “pacote” com “npm install --save mongoose-unique- validator” no nosso projeto • E para usar no programa precisamos: • Acessar, por meio de “schema”, o “método plugin” que permite anexar um plugin no “nosso schema” • Importar o pacote • É o “plug” que vamos utilizar Criando Modelos com Mongoose • Falta só mais “uma coisa”.. • Precisamos dizer para o Mongoose como ele vai efetivar a relação entre “User” e “Message” • Como ele vai efetivamente “amarrar os dois modelos” Criando Modelos com Mongoose • Para resolver isso temosque usar outro propriedade de configuração. O “ref” • “ref” diz para o Mongoose que o campo tem uma conexão com outro modelo. • Temos que passar o “nome do modelo” que queremos associar Armazenando Dados no Banco • Agora vamos “salvar” os dados do “User” no MongoDB • Para o exemplo, vamos fazer algumas modificações na view do servidor: “node.hbs” • E no “app.js de routes” Armazenando Dados no Banco • O campo de texto vai conter o “email” • Este é o valor que vamos obter para salvar no banco • Rota que vamos criar para enviar o formulário via “post” • Vale lembrar o nome do banco que iremos utilizar Armazenando Dados no Banco • xxxx • Rota via get que renderiza a página “node.hbs” • Recupera o valor digitado no formulário no campo “emailBody” • A variável “User” permite importar o nosso modelo para ser instanciado posteriormente • Instância um objeto baseado no modelo “User” e preenche com dados • Uma vez que já temos um objeto criado, baseado no nosso modelo “User”, e populado, podemos usar “save()” do Mongoose para salvar os dados do usuário no banco Armazenando Dados no Banco • xxxx Armazenando Dados no Banco • xxxx Dica • Para visualizar as transações (F12) Armazenando Dados no Banco Dica • Ferramenta para ajudar a analisar requisições, seja GET, POST, etc... Armazenando Dados no Banco • xxxx Dica • Ferramenta para ajudar a analisar requisições, seja GET, POST, etc... Buscando Dados no Banco • Agora vamos “buscar” os dados do “User” no MongoDB • Para o exemplo, vamos fazer algumas modificações na view do servidor: “node.hbs” • E no “app.js de routes” Buscando Dados no Banco • Este são os campos que terão os valores que vamos recuperar do banco • Vamos “imprimir” o resultado com “{{ }}” • Vale lembrar o nome do banco que iremos utilizar Buscando Dados no Banco • Rota de busca via get que renderiza a página “node.hbs” • A variável “User” permite importar o nosso modelo. Ela representa o nosso modelo de usuário – “user.js” • Permite renderizar a página “node.hbs” passando como valor para o parâmetro “firstNameV” o documento recuperado • Caso ocorra algum erro, um simples texto é enviado. Caso contrário, renderiza a página • Vamos chamar o método “findOne()” de “User” com os seguintes argumentos: • Um filtro, que define o critério de busca”. Neste caso é o primeiro registro que encontrar, sem critério “{ }” • Uma “função callback” que nos retorna um erro (“err”), caso ocorra, e o “documents recuperado” (“documents”) Buscando Dados no Banco • Reparem que foi retornado todo o “document” em uma única representação • Como se fosse um único objeto • Logo precisamos fazer uma alteração no “app.js de routes” Buscando Dados no Banco • A variável “User” permite importar o nosso modelo • Vamos extrair do “documents” recuperado cada um dos campos do modelo Buscando Dados no Banco Buscando Dados no Banco • Alguns outros exemplos: Dica: • Use qualquer método para buscar dados no banco diretamente via o modelo • E use o método com callback, incluindo a resposta renderizada • Se você executar qualquer código fora do callback você não terá acesso aos dados recuperados porque ele não estará mais lá... Para se aprofundar bastante no assunto • Mongoose Docs: – http://mongoosejs.com/docs/guide.html Atividades • Para fechar – Vamos criar um novo modelo para ser usado em uma página de registro de usuário • Crie um novo arquivo CSS na estrutura – styleregister.css • Crie um template “registro-usuario-salvar.hbs” – Use como exemplo o “index.hbs” para pegar os imports do bootstrap além do CSS e a estrutura base do HTML • Coloque o código HTML de um “registro de dados” (register-parteI.txt) • Acesse esse template pela rota “localhost/registro-usuario-salvar” – Crie um novo modelo com os dados solicitados no registro – Agora ao registrar, • Redirecione para uma nova página template “registro-usuario- consultar.hbs” • E recupere e mostre os dados persistido. Atividades • IMAGENS... Atividades • Dado a base de dados abaixo (vc pode criar a sua tb), construa uma página que: – Recupere os dados a partir do email fornecido. (O filtro é o e-mail) – E que a rota tenha esse email como “Request Params” • Dicas: