При разработке приложения Node.js с использованием Express.js эффективное структурирование базы кода имеет решающее значение для удобства сопровождения, масштабируемости и простоты совместной работы. Хорошо организованная структура проекта позволяет управлять сложностью, облегчая навигацию и понимание кода. В этом блоге мы рассмотрим типичную структуру папок приложения Express.js и объясним назначение каждого каталога и файла.
Обзор структуры проекта
Вот стандартная структура папок для приложения 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
Пояснение каждого каталога и файла
app.js
Файл app.js — это точка входа вашего приложения. Здесь вы инициализируете приложение Express, настраиваете промежуточное программное обеспечение, определяете маршруты и запускаете сервер. Думайте об этом как о центре управления вашим веб-приложением.
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;
бин
Каталог bin обычно содержит сценарии для запуска вашего веб-сервера. Эти сценарии можно использовать для установки переменных среды или управления различными средами (например, разработка, производство).
Пример: 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); }
конфигурация
В каталоге config хранятся файлы конфигурации вашего приложения, такие как подключения к базе данных, настройки сервера и переменные среды.
Пример: config/index.js
module.exports = { port: process.env.PORT || 3000, db: { host: 'localhost', port: 27017, name: 'mydatabase' } };
контроллеры
Контроллеры содержат логику обработки входящих запросов и генерации ответов. Каждый файл в каталоге контроллеров обычно соответствует отдельной части вашего приложения (например, клиентам, продуктам).
Пример: контроллеры/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 }); } };
промежуточное программное обеспечение
Функции промежуточного программного обеспечения используются для обработки запросов до того, как они достигнут контроллеров. Они могут выполнять такие задачи, как аутентификация, ведение журнала и проверка запросов.
Пример: промежуточное программное обеспечение/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' }); } };
модели
Модели определяют структуру ваших данных и управляют взаимодействием с базой данных. Каждый файл модели обычно соответствует отдельному объекту данных (например, «Клиент», «Продукт»).
Пример: models/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);
маршруты
Маршруты определяют пути к различным частям вашего приложения и сопоставляют их с соответствующими контроллерами.
Пример: маршруты/api.js
const express = require('express'); const router = express.Router(); const customerController = require('../controllers/customer'); router.get('/customers', customerController.getAllCustomers); module.exports = router;
публичный
Общий каталог содержит статические файлы, такие как CSS, JavaScript и изображения, которые передаются непосредственно клиенту.
Пример: структура каталогов
public/ ├── css/ ├── js/ ├── images/
просмотры
Представления — это шаблоны, которые отображают HTML для клиента. Используя механизм шаблонов, такой как EJS, Pug или Handlebars, вы можете создавать динамический HTML.
Пример: просмотры/index.ejs
My App Welcome to My App
тесты
Каталог тестов содержит тестовые файлы, позволяющие убедиться в корректной работе вашего приложения. Тесты часто делятся на модульные тесты, интеграционные тесты и сквозные (e2e) тесты.
Пример: структура каталогов
tests/ ├── unit/ ├── integration/ ├── e2e/
утилиты
Служебные функции и вспомогательные модули хранятся в каталоге utils. Эти функции выполняют общие задачи, такие как проверка и форматирование, которые используются во всем приложении.
Пример: utils/validation.js
exports.isEmailValid = (email) => { const re = /^[^\s@] @[^\s@] \.[^\s@] $/; return re.test(String(email).toLowerCase()); };
модули_узла
Каталог node_modules содержит все зависимости, необходимые вашему проекту. Этот каталог управляется npm (или Yarn) и включает пакеты, установленные из реестра npm.
Заключение
Хорошо структурированное приложение Node.js, использующее Express.js, повышает удобство обслуживания, масштабируемость и возможности совместной работы. Каждый каталог и файл в структуре служат определенной цели: от обработки конфигурации и определения маршрутов до управления промежуточным программным обеспечением и представлениями рендеринга. Эффективно организовав свою кодовую базу, вы сможете легко создавать надежные и масштабируемые приложения.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3