Organização de Projeto em Arquitetura MVC
Área: Backend | Nível recomendado: Iniciante
Vídeo
Link direto: https://youtu.be/TGS1ViNOpVw
Tópicos
Introdução ao MVC:
Explicação teórica sobre a arquitetura MVC e seus benefícios.
Análise de como o MVC pode ser implementado em uma aplicação Node.js.
Reestruturação do Projeto:
Organização do código atual em model, view e controllers.
Refatoração das rotas para utilizar os controllers.
Implementação Prática:
Criação de um exemplo prático de CRUD utilizando a arquitetura MVC.
Material de Apoio
Repositório no GitHub
PDF para Download
Miro
Exercícios de Fixação
Exercícios de Validação
Desafio de Código
Fornecemos um arquivo index.js
que contém um endpoint simples. Separe esse código em um projeto seguindo a arquitetura MVC, criando os arquivos necessários para organizar o projeto em Models, Views e Controllers.
Arquivo Inicial
const express = require('express');
const app = express();
app.use(express.json());
const produtos = [];
app.post('/produtos', (req, res) => {
const novoProduto = req.body;
if (!novoProduto.nome || !novoProduto.preco || !novoProduto.categoria) {
return res.status(400).send('Corpo da requisição deve conter as propriedades nome, preço e categoria.');
}
produtos.push(novoProduto);
res.status(201).send(novoProduto);
});
app.listen(3000, () => {
console.log(`Servidor rodando em http://localhost:3000`);
});
Tarefas
Configuração Inicial:
Crie a estrutura de pastas conforme o padrão MVC.
src ├── db │ └── database-connection.js ├── produto │ ├── produto.controller.js │ ├── produto.router.js │ └── produto.service.js
Implementação dos Controllers:
Mova a lógica de validação e criação do produto para o controller no arquivo
produto.controller.js
.
Implementação dos Services:
Mova a lógica de manipulação de dados para o service no arquivo
produto.service.js
.
Configuração das Rotas:
Configure as rotas no arquivo
produto.router.js
para utilizar os métodos do controller.
Atualização do Servidor:
Atualize o arquivo
index.js
para usar as rotas configuradas.
Código Esperado
const service = require('./produto.service');
async function create(req, res) {
const novoProduto = req.body;
if (!novoProduto.nome || !novoProduto.preco || !novoProduto.categoria) {
return res.status(400).send('Corpo da requisição deve conter as propriedades nome, preço e categoria.');
}
await service.create(novoProduto);
res.status(201).send(novoProduto);
}
module.exports = {
create
};
const produtos = [];
function create(novoProduto) {
produtos.push(novoProduto);
}
module.exports = {
create
};
const express = require('express');
const controller = require('./produto.controller');
const router = express.Router();
router.post('/', controller.create);
module.exports = router;
const express = require('express');
const produtoRouter = require('./src/produto/produto.router');
const app = express();
app.use(express.json());
app.use('/produtos', produtoRouter);
app.listen(3000, () => {
console.log(`Servidor rodando em http://localhost:${port}`);
});
{%
endcode %}
Feedback: Certifique-se de que a lógica de validação está no controller e a lógica de manipulação de dados está no service. Configure as rotas corretamente para usar o controller.
Revisão de Código
Analise o código a seguir, encontre e corrija o erro relacionado à separação de responsabilidades na arquitetura MVC.
const express = require('express');
const { MongoClient, ObjectId } = require('mongodb');
const app = express();
app.use(express.json());
const dbUrl = process.env.DATABASE_URL;
const client = new MongoClient(dbUrl);
async function main() {
await client.connect();
const db = client.db('app');
const collection = db.collection('produtos');
app.post("/produtos", async function (req, res) {
const novoItem = req.body;
if (!novoItem.nome || !novoItem.preco || !novoItem.categoria) {
return res.status(400).send('Corpo da requisição deve conter as propriedades nome, preço e categoria.');
}
await collection.insertOne(novoItem);
res.status(201).send(novoItem);
});
app.listen(3000, function () {
console.log(`Aplicação rodando em http://localhost:3000`);
});
}
main();
Projeto Prático
Reestruture uma aplicação Node.js existente para seguir a arquitetura MVC. A aplicação deve gerenciar uma entidade "Produtos" com as propriedades "nome", "preço" e "categoria". Crie os arquivos necessários para organizar o projeto em Models, Views e Controllers, e implemente operações CRUD para a entidade "Produtos".
Tarefas
Configuração Inicial:
Inicialize um novo projeto NodeJS.
Instale o ExpressJS e o MongoDB Driver.
Configure o Nodemon para reiniciar o servidor automaticamente.
Crie um arquivo
.env
e adicione as variáveis de ambiente necessárias.
Estrutura de Pastas:
Crie a estrutura de pastas conforme o padrão MVC.
src ├── db │ └── database-connection.js ├── produto │ ├── produto.controller.js │ ├── produto.router.js │ └── produto.service.js
Conexão com o MongoDB:
Configure a conexão com o MongoDB utilizando o MongoClient e as variáveis de ambiente no arquivo
database-connection.js
.
Implementação dos Controllers:
Implemente os métodos do controller para operações CRUD no arquivo
produto.controller.js
.
Implementação dos Services:
Implemente os métodos de acesso aos dados no arquivo
produto.service.js
.
Configuração das Rotas:
Configure as rotas no arquivo
produto.router.js
para utilizar os métodos do controller.
Inicialização do Servidor:
Configure a inicialização do servidor no arquivo
index.js
e adicione as rotas.
Last updated