«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как структурировать свой серверный код в Node.js (Express.js)

Как структурировать свой серверный код в Node.js (Express.js)

Опубликовано 25 августа 2024 г.
Просматривать:605

How to Structure Your Backend Code in Node.js (Express.js)

При разработке приложения 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, повышает удобство обслуживания, масштабируемость и возможности совместной работы. Каждый каталог и файл в структуре служат определенной цели: от обработки конфигурации и определения маршрутов до управления промежуточным программным обеспечением и представлениями рендеринга. Эффективно организовав свою кодовую базу, вы сможете легко создавать надежные и масштабируемые приложения.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/kafeel_ahmad/how-to-structure-your-backend-code-in-nodejs-expressjs-2e07?1 Если есть какие-либо нарушения, пожалуйста, свяжитесь с [email protected] удалить его
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3