Leodario.com

Leodario.com – Tudo sobre Tecnologia

Aula 48 – API JavaScript, Node.js e Express – MongoDB with Mongoose – ODM para MongoDB

Imagem destacada da aula de API

Introdução (3 min)

Imagine um garçom anotando pedidos em um bloco de notas. Este bloco é como o MongoDB, um banco de dados NoSQL que armazena dados de forma flexível, como documentos JSON. O Mongoose é como um tradutor especializado que facilita a comunicação entre seu aplicativo Node.js e o MongoDB. Ele fornece uma estrutura organizada e intuitiva, permitindo que você interaja com o banco de dados de forma eficiente e segura.

Dominar o Mongoose é fundamental para construir APIs modernas e escaláveis com Node.js e Express. Nesta aula, você aprenderá a modelar seus dados, realizar operações CRUD (Criar, Ler, Atualizar, Deletar) e implementar as melhores práticas de desenvolvimento com este poderoso ODM (Object Document Mapper).

Dentro do ecossistema Node.js/Express, o Mongoose atua como uma ponte essencial entre sua aplicação e o banco de dados MongoDB, simplificando significativamente o desenvolvimento e manutenção do seu backend.

Conceito Fundamental (7 min)

O Mongoose é um ODM (Object Document Mapper) para MongoDB e Node.js. Ele fornece uma estrutura robusta para modelar seus dados, definindo esquemas que validam e organizam as informações armazenadas no banco de dados. Isso possibilita a interação com o MongoDB utilizando objetos JavaScript familiares, abstraindo a complexidade das operações de baixo nível.

Termos como schema, model e document são vitais no contexto do Mongoose. Um schema define a estrutura dos dados, um model é a representação abstrata dessa estrutura e um document é uma instância específica de um model, contendo os dados reais.

Em produção, o Mongoose é utilizado em aplicações web, APIs RESTful, microsserviços e diversas outras soluções que necessitam de um banco de dados NoSQL flexível e escalável. Ele se integra perfeitamente com frameworks como Express.js, facilitando a construção de backends robustos.

Entre as vantagens do Mongoose, destacam-se a validação de dados, a simplificação de queries complexas e a tipagem de dados. Como desvantagem, podemos citar uma pequena curva de aprendizado inicial.

Implementação Prática (10 min)

// Importa as bibliotecas necessárias
const mongoose = require('mongoose');

// URL de conexão com o MongoDB (ajuste para o seu HostGator Plano M) const dbURI = 'mongodb://usuario:senha@seuhost:porta/nome_do_banco';

// Configura as opções de conexão const dbOptions = { useNewUrlParser: true, useUnifiedTopology: true, // Outras configurações relevantes para o Plano M (se necessário) };

// Conecta ao banco de dados mongoose.connect(dbURI, dbOptions) .then(() => console.log('Conectado ao MongoDB')) .catch(err => console.error('Erro na conexão:', err));

// Define o schema para um usuário const userSchema = new mongoose.Schema({ nome: { type: String, required: true }, email: { type: String, required: true, unique: true }, idade: Number, ativo: { type: Boolean, default: true } });

// Cria o model a partir do schema const Usuario = mongoose.model('Usuario', userSchema);

// Cria um novo usuário const novoUsuario = new Usuario({ nome: 'João Silva', email: '[email protected]', idade: 30 });

// Salva o novo usuário no banco de dados novoUsuario.save() .then(usuario => console.log('Usuário salvo:', usuario)) .catch(err => console.error('Erro ao salvar usuário:', err));

// Busca um usuário por email Usuario.findOne({ email: '[email protected]' }) .then(usuario => { if (usuario) { console.log('Usuário encontrado:', usuario); // Atualiza a idade do usuário usuario.idade = 31; return usuario.save(); // Retorna a promise para encadear a próxima operação } else { console.log('Usuário não encontrado.'); return Promise.resolve(); // Retorna uma promise resolvida para evitar erros no encadeamento } }) .then(usuarioAtualizado => { // Callback após a atualização (ou null se não encontrou) if (usuarioAtualizado) { console.log('Usuário atualizado:', usuarioAtualizado); } }) .catch(err => console.error('Erro ao buscar/atualizar usuário:', err));

Exercício Hands-On (5 min)

Crie um novo schema para “Produtos” com os seguintes campos: nome (String, obrigatório), preco (Number, obrigatório), descricao (String) e categoria (String). Implemente a lógica para criar um novo produto e salvá-lo no banco de dados.

Solução:

// ... (código anterior)

const produtoSchema = new mongoose.Schema({ nome: { type: String, required: true }, preco: { type: Number, required: true }, descricao: String, categoria: String });

const Produto = mongoose.model('Produto', produtoSchema);

const novoProduto = new Produto({ nome: 'Camiseta', preco: 29.90, descricao: 'Camiseta de algodão', categoria: 'Vestuário' });

novoProduto.save() .then(produto => console.log('Produto salvo:', produto)) .catch(err => console.error('Erro ao salvar produto:', err));

Para testar, execute o código e verifique se o produto foi inserido corretamente no seu banco de dados MongoDB. Utilize um client MongoDB como o MongoDB Compass para visualizar os dados. Em caso de erros, revise o código e as mensagens de erro para identificar a causa do problema. Como próximos passos, explore outros métodos do Mongoose, como findByIdAndUpdate para atualizar documentos e findByIdAndDelete para remover documentos.

🚀 Pronto para a próxima aula?

Continue sua jornada no desenvolvimento de APIs e domine Node.js & Express!

📚 Ver todas as aulas