Estruturas de projetos baseado em MVC com NodeJS e MongoDB 🏗️
Tags: javascript, node, mongodb, mvc
Published: 2023-10-17 19:21:24


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dhu9tbf0wkztehk4xdvq.png)

A estrutura de projeto que eu vou descrever não é um padrão de design específico, mas é uma **organização** comum que se baseia em **princípios** do padrão de design MVC _(Model-View-Controller)_ em um contexto de desenvolvimento utilizando **NodeJS** e **MongoDB**.
Ou seja, é uma estrutura de projeto que segue os princípios do MVC, mas não é necessariamente chamada de MVC em si.

Essa é uma abordagem para deixar o código mais organizado e limpo, separando as responsabilidades em **pastas diferentes**. Em resumo, é uma estrutura de projeto que é **influenciada** pelo padrão MVC, mas não é um framework ou implementação formal.

---

## controllers 🎮
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/srgjw3d71mgraotno39f.png)
A pasta **controllers** é responsável por guardar os controladores do aplicativo. Os controladores são responsáveis por manipular **requisições HTTP**, chamar **funções** dos modelos e retornar as **respostas** para o cliente. Normalmente cada arquivo nessa pasta vai representar uma entidade ou recurso do aplicativo e contém funções pra lidar com operações relacionadas a ele.

---

## data 📂
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b2y0ah1ljzc5jby4vj72.png)
A pasta **data** é responsável por armazenar dados brutos: arquivos JSON, CSV ou scripts que foram gerados no banco de dados. Pode  também conter scripts Node.js que são responsáveis por inicializar o banco de dados com dados iniciais. A pasta data é **flexível** e seu conteúdo pode variar de projeto para projeto, dependendo das necessidades específicas.

---

## models 🏗️
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fwlbefj883dxifwf11i9.png)

A pasta models contém os modelos do MongoDB, que definem a **estrutura dos documentos** no banco de dados. Cada arquivo nessa pasta representa um tipo de documento e define os campos, validações e métodos.

---

## public 🌐
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p0pxayy1mmkya1z4abay.png)
A pasta public é usada para armazenar **arquivos estáticos**, como arquivos CSS, Javascript, imagens e arquivos de mídia. É interessante criar **subdiretórios** para categorizar os diferentes tipos de recursos, como o CSS para estilização e JS para scripts.

---

## routes 🚦
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v12m1looidkkdtzqiqyh.png)
É onde as definições de rota e controladores associados são mantidas. Gerenciam as **solicitações HTTP**. Cada rota pode responder a diferentes métodos HTTP, como GET, POST, PUT, DELETE, etc. Geralmente, cada arquivo nessa pasta corresponde a um grupo de rotas relacionadas a um recurso específico.

---

## util 🛠️
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bpex1i9ezfm3ayvs8pqj.png)
Essa pasta pode conter **utilitários** ou módulos de uso geral que não se encaixam bem em outras categorias. Geralmente possui funções de utilidade, validações e configurações comuns.

---

## views 👁️
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qamwm0bspi3gg60ur21u.png)
A pasta views é onde os arquivos de modelo são armazenados e usados para renderizar a **interface do usuário**. Esses arquivos geralmente contém código HTML. Geralmente se utiliza um **mecanismo de template** como EJS, Handlebars, Pug e etc.

---
Organizando o projeto dessa maneira deixa cada pasta com um papel específico, o que torna a manutenção e colaboração mais eficiente, pois as **responsabilidades** estão bem definidas. A estrutura exata de um projeto vai variar de acordo com as necessidades do aplicativo e a preferência do time. Entretanto, a organização em camadas e a separação de responsabilidades são princípios importantes a serem seguidos.