Integrando o banco de dados à API com Mongoose.
$ npm install mongoose dotenv
// .env
MONGODB_URI=mongodb+srv://user:pass@
cluster0.abc.mongodb.net/minha-api
// Estrutura do projeto
minha-api/
├── models/
│ └── Aluno.js
├── controllers/
│ └── alunoController.js
├── routes/
│ └── alunoRoutes.js
├── .env
├── .gitignore
└── index.js
require('dotenv').config();
const express = require('express');
const mongoose = require('mongoose');
const app = express();
app.use(express.json());
// Conectar ao MongoDB
mongoose.connect(process.env.MONGODB_URI)
.then(() => console.log('✅ MongoDB conectado!'))
.catch(err => console.log('❌ Erro:', err));
// Rotas
app.use('/alunos', require('./routes/alunoRoutes'));
app.listen(3000, () => console.log('Servidor em http://localhost:3000'));
const mongoose = require('mongoose');
const alunoSchema = new mongoose.Schema({
nome: {
type: String,
required: [true, 'Nome é obrigatório'],
trim: true
},
email: {
type: String,
required: true,
unique: true,
lowercase: true
},
idade: { type: Number, min: 16, max: 100 },
curso: { type: String, default: 'Programação Web' },
notas: [Number],
ativo: { type: Boolean, default: true }
}, { timestamps: true });
module.exports = mongoose.model('Aluno', alunoSchema);
timestamps: true adiciona automaticamente createdAt e updatedAt em cada documento.
const Aluno = require('../models/Aluno');
// Listar todos
exports.listar = async (req, res) => {
const alunos = await Aluno.find();
res.json(alunos);
};
// Buscar por ID
exports.buscar = async (req, res) => {
const aluno = await Aluno.findById(req.params.id);
if (!aluno) return res.status(404).json({ erro: 'Nao encontrado' });
res.json(aluno);
};
// Criar
exports.criar = async (req, res) => {
const aluno = await Aluno.create(req.body);
res.status(201).json(aluno);
};
// Atualizar
exports.atualizar = async (req, res) => {
const aluno = await Aluno.findByIdAndUpdate(
req.params.id, req.body, { new: true }
);
res.json(aluno);
};
// Remover
exports.remover = async (req, res) => {
await Aluno.findByIdAndDelete(req.params.id);
res.json({ mensagem: 'Removido com sucesso' });
};
const router = require('express').Router();
const ctrl = require(
'../controllers/alunoController'
);
router.get('/', ctrl.listar);
router.get('/:id', ctrl.buscar);
router.post('/', ctrl.criar);
router.put('/:id', ctrl.atualizar);
router.delete('/:id', ctrl.remover);
module.exports = router;
nome: {
type: String,
required: [true, 'Nome obrigatório'],
minlength: [3, 'Mínimo 3 caracteres'],
maxlength: 100,
trim: true
},
email: {
type: String,
required: true,
unique: true,
match: [/^\S+@\S+\.\S+$/, 'Email inválido']
},
idade: {
type: Number,
min: [16, 'Mín. 16 anos'],
max: [100, 'Máx. 100 anos']
}
exports.criar = async (req, res) => {
try {
const aluno = await Aluno.create(
req.body
);
res.status(201).json(aluno);
} catch (err) {
if (err.name === 'ValidationError') {
res.status(400).json({
erro: err.message
});
} else {
res.status(500).json({
erro: 'Erro do servidor'
});
}
}
};
// Buscar com filtro
const ativos = await Aluno.find({
ativo: true
});
// Selecionar campos específicos
const nomes = await Aluno
.find()
.select('nome email');
// Ordenar e limitar
const top5 = await Aluno
.find()
.sort({ nome: 1 })
.limit(5);
// GET /alunos?curso=Web&ativo=true
exports.listar = async (req, res) => {
const filtro = {};
if (req.query.curso)
filtro.curso = req.query.curso;
if (req.query.ativo)
filtro.ativo = req.query.ativo;
const alunos = await Aluno
.find(filtro)
.sort({ nome: 1 });
res.json(alunos);
};
# .env (NÃO versionar!)
MONGODB_URI=mongodb+srv://user:pass@...
PORT=3000
JWT_SECRET=minha-chave-secreta
# .gitignore
node_modules/
.env
.DS_Store
// No topo do index.js
require('dotenv').config();
// Acessar variáveis
const PORT = process.env.PORT || 3000;
const URI = process.env.MONGODB_URI;
.env for commitado no Git, suas senhas estarão expostas publicamente!
Aluno com validações?curso=Web)Curso e relacione com os alunos.
Autenticação com JWT e sessões.