"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Cómo estructurar su código backend en Node.js (Express.js)

Cómo estructurar su código backend en Node.js (Express.js)

Publicado el 2024-08-25
Navegar:911

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

Al desarrollar una aplicación Node.js utilizando Express.js, estructurar su código base de manera efectiva es crucial para la mantenibilidad, la escalabilidad y la facilidad de colaboración. Una estructura de proyecto bien organizada le permite gestionar la complejidad, lo que facilita la navegación y la comprensión del código. En este blog, exploraremos una estructura de carpetas típica para una aplicación Express.js y explicaremos el propósito de cada directorio y archivo.

Descripción general de la estructura del proyecto
A continuación se muestra una estructura de carpetas común para una aplicación 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

Explicación de cada directorio y archivo
aplicación.js
El archivo app.js es el punto de entrada de su aplicación. Es donde inicializa la aplicación Express, configura el middleware, define rutas e inicia el servidor. Piense en ello como el centro de control de su aplicación 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;

papelera
El directorio bin normalmente contiene scripts para iniciar su servidor web. Estos scripts se pueden utilizar para establecer variables de entorno o gestionar diferentes entornos (por ejemplo, desarrollo, producción).

Ejemplo: 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);
}

configuración
El directorio de configuración contiene archivos de configuración para su aplicación, como conexiones de bases de datos, configuraciones del servidor y variables de entorno.

Ejemplo: config/index.js

module.exports = {
  port: process.env.PORT || 3000,
  db: {
    host: 'localhost',
    port: 27017,
    name: 'mydatabase'
  }
};

controladores
Los controladores contienen la lógica para manejar las solicitudes entrantes y generar respuestas. Cada archivo en el directorio de controladores normalmente corresponde a una parte diferente de su aplicación (por ejemplo, clientes, productos).

Ejemplo: controladores/cliente.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
Las funciones de middleware se utilizan para procesar solicitudes antes de que lleguen a los controladores. Pueden manejar tareas como autenticación, registro y validación de solicitudes.

Ejemplo: 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
Los modelos definen la estructura de sus datos y manejan las interacciones con la base de datos. Cada archivo de modelo normalmente corresponde a una entidad de datos diferente (p. ej., Cliente, Producto).

Ejemplo: modelos/cliente.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);

rutas
Las rutas definen las rutas a diferentes partes de su aplicación y las asignan a los controladores apropiados.

Ejemplo: rutas/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
El directorio público contiene archivos estáticos como CSS, JavaScript e imágenes que se entregan directamente al cliente.

Ejemplo: Estructura de directorio

public/
├── css/
├── js/
├── images/

vistas
Las vistas son plantillas que representan el HTML para el cliente. Utilizando un motor de plantillas como EJS, Pug o Manillars, puedes generar HTML dinámico.

Ejemplo: vistas/index.ejs



  My App

Welcome to My App

pruebas
El directorio de pruebas contiene archivos de prueba para garantizar que su aplicación funcione correctamente. Las pruebas suelen organizarse en pruebas unitarias, pruebas de integración y pruebas de un extremo a otro (e2e).

Ejemplo: Estructura de directorio

tests/
├── unit/
├── integration/
├── e2e/

utilidades
Las funciones de utilidad y los módulos auxiliares se almacenan en el directorio de utilidades. Estas funciones realizan tareas comunes como validación y formateo que se utilizan en toda la aplicación.

Ejemplo: utils/validation.js

exports.isEmailValid = (email) => {
  const re = /^[^\s@] @[^\s@] \.[^\s@] $/;
  return re.test(String(email).toLowerCase());
};

módulos_nodo
El directorio node_modules contiene todas las dependencias que su proyecto necesita. Este directorio es administrado por npm (o hilo) e incluye paquetes instalados desde el registro de npm.

Conclusión
Una aplicación Node.js bien estructurada que utilice Express.js mejora la capacidad de mantenimiento, la escalabilidad y la colaboración. Cada directorio y archivo en la estructura tiene un propósito específico, desde manejar la configuración y definir rutas hasta administrar middleware y renderizar vistas. Al organizar su base de código de manera efectiva, puede crear aplicaciones sólidas y escalables con facilidad.

Declaración de liberación Este artículo se reproduce en: https://dev.to/kafeel_ahmad/how-to-structure-your-backend-code-in-nodejs-expressjs-2e07?1 Si hay alguna infracción, comuníquese con [email protected] para borrarlo
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3