Ao desenvolver um aplicativo Node.js usando Express.js, estruturar sua base de código de forma eficaz é crucial para manutenção, escalabilidade e facilidade de colaboração. Uma estrutura de projeto bem organizada permite gerenciar a complexidade, facilitando a navegação e a compreensão do código. Neste blog, exploraremos uma estrutura de pastas típica para um aplicativo Express.js e explicaremos a finalidade de cada diretório e arquivo.
Visão geral da estrutura do projeto
Aqui está uma estrutura de pastas comum para um aplicativo Express.js:
? ├── ? app.js ├── ? bin ├── ? config ├── ? controllers │ ├── ? customer.js │ ├── ? product.js │ └── ... ├── ? middleware │ ├── ? auth.js │ ├── ? logger.js │ └── ... ├── ? models │ ├── ? customer.js │ ├── ? product.js │ └── ... ├── ? routes │ ├── ? api.js │ ├── ? auth.js │ └── ... ├── ? public │ ├── ? css │ ├── ? js │ ├── ? images │ └── ... ├── ? views │ ├── ? index.ejs │ ├── ? product.ejs │ └── ... ├── ? tests │ ├── ? unit │ ├── ? integration │ ├── ? e2e │ └── ... ├── ? utils │ ├── ? validation.js │ ├── ? helpers.js │ └── ... └── ? node_modules
Explicação de cada diretório e arquivo
aplicativo.js
O arquivo app.js é o ponto de entrada do seu aplicativo. É onde você inicializa o aplicativo Express, configura o middleware, define rotas e inicia o servidor. Pense nele como o centro de controle da sua aplicação web.
const express = require('express'); const app = express(); const config = require('./config'); const routes = require('./routes'); // Middleware setup app.use(express.json()); // Routes setup app.use('/api', routes); // Start server const PORT = config.port || 3000; app.listen(PORT, () => { console.log(`Server running on port ${PORT}`); }); module.exports = app;
lixo
O diretório bin normalmente contém scripts para iniciar seu servidor web. Esses scripts podem ser usados para definir variáveis de ambiente ou gerenciar diferentes ambientes (por exemplo, desenvolvimento, produção).
Exemplo: bin/www
#!/usr/bin/env node const app = require('../app'); const debug = require('debug')('your-app:server'); const http = require('http'); const port = normalizePort(process.env.PORT || '3000'); app.set('port', port); const server = http.createServer(app); server.listen(port); server.on('error', onError); server.on('listening', onListening); function normalizePort(val) { const port = parseInt(val, 10); if (isNaN(port)) return val; if (port >= 0) return port; return false; } function onError(error) { if (error.syscall !== 'listen') throw error; const bind = typeof port === 'string' ? 'Pipe ' port : 'Port ' port; switch (error.code) { case 'EACCES': console.error(bind ' requires elevated privileges'); process.exit(1); break; case 'EADDRINUSE': console.error(bind ' is already in use'); process.exit(1); break; default: throw error; } } function onListening() { const addr = server.address(); const bind = typeof addr === 'string' ? 'pipe ' addr : 'port ' addr.port; debug('Listening on ' bind); }
configuração
O diretório config contém arquivos de configuração para seu aplicativo, como conexões de banco de dados, configurações de servidor e variáveis de ambiente.
Exemplo: config/index.js
module.exports = { port: process.env.PORT || 3000, db: { host: 'localhost', port: 27017, name: 'mydatabase' } };
controladores
Os controladores contêm a lógica para lidar com solicitações recebidas e gerar respostas. Cada arquivo no diretório controllers normalmente corresponde a uma parte diferente do seu aplicativo (por exemplo, clientes, produtos).
Exemplo: controllers/customer.js
const Customer = require('../models/customer'); exports.getAllCustomers = async (req, res) => { try { const customers = await Customer.find(); res.json(customers); } catch (err) { res.status(500).json({ message: err.message }); } };
middleware
As funções de middleware são usadas para processar solicitações antes que elas cheguem aos controladores. Eles podem lidar com tarefas como autenticação, registro e validação de solicitação.
Exemplo: middleware/auth.js
module.exports = (req, res, next) => { const token = req.header('Authorization'); if (!token) return res.status(401).json({ message: 'Access Denied' }); try { const verified = jwt.verify(token, process.env.JWT_SECRET); req.user = verified; next(); } catch (err) { res.status(400).json({ message: 'Invalid Token' }); } };
modelos
Os modelos definem a estrutura dos seus dados e lidam com as interações com o banco de dados. Cada arquivo de modelo normalmente corresponde a uma entidade de dados diferente (por exemplo, Cliente, Produto).
Exemplo: modelos/customer.js
const mongoose = require('mongoose'); const customerSchema = new mongoose.Schema({ name: { type: String, required: true }, email: { type: String, required: true, unique: true }, createdAt: { type: Date, default: Date.now } }); module.exports = mongoose.model('Customer', customerSchema);
rotas
As rotas definem os caminhos para diferentes partes do seu aplicativo e os mapeiam para os controladores apropriados.
Exemplo: rotas/api.js
const express = require('express'); const router = express.Router(); const customerController = require('../controllers/customer'); router.get('/customers', customerController.getAllCustomers); module.exports = router;
público
O diretório público contém arquivos estáticos como CSS, JavaScript e imagens que são servidos diretamente ao cliente.
Exemplo: estrutura de diretório
public/ ├── css/ ├── js/ ├── images/
visualizações
Visualizações são modelos que renderizam o HTML para o cliente. Usando um mecanismo de modelagem como EJS, Pug ou Handlebars, você pode gerar HTML dinâmico.
Exemplo: visualizações/index.ejs
My App Welcome to My App
testes
O diretório de testes contém arquivos de teste para garantir que seu aplicativo funcione corretamente. Os testes são frequentemente organizados em testes de unidade, testes de integração e testes ponta a ponta (e2e).
Exemplo: estrutura de diretório
tests/ ├── unit/ ├── integration/ ├── e2e/
utilitários
Funções utilitárias e módulos auxiliares são armazenados no diretório utils. Essas funções executam tarefas comuns como validação e formatação que são usadas em todo o aplicativo.
Exemplo: utils/validation.js
exports.isEmailValid = (email) => { const re = /^[^\s@] @[^\s@] \.[^\s@] $/; return re.test(String(email).toLowerCase()); };
node_modules
O diretório node_modules contém todas as dependências que seu projeto precisa. Este diretório é gerenciado pelo npm (ou fio) e inclui pacotes instalados a partir do registro npm.
Conclusão
Um aplicativo Node.js bem estruturado usando Express.js melhora a capacidade de manutenção, escalabilidade e colaboração. Cada diretório e arquivo na estrutura serve a um propósito específico, desde o tratamento da configuração e definição de rotas até o gerenciamento de middleware e visualizações de renderização. Ao organizar sua base de código de maneira eficaz, você pode criar aplicativos robustos e escalonáveis com facilidade.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3