Proyecto base con Express.js, organizado por carpetas y conectado a MongoDB Atlas. El CRUD de productos persiste datos en la base de datos.
- Node.js instalado
- npm instalado
npm init -y
npm install express
npm install mongoose dotenv
npm install -D nodemonCrear un archivo .env en la raiz del proyecto:
PORT=3000
MONGODB_URI=mongodb+srv://<user>:<password>@cluster0.xxxxx.mongodb.net/<database>?retryWrites=true&w=majorityEn package.json:
"scripts": {
"start": "node src/server.js",
"dev": "nodemon src/server.js",
"test": "echo \"Error: no test specified\" && exit 1"
}npm start: ejecuta el servidor en modo normal.npm run dev: ejecuta con recarga automatica (nodemon).
ExpressApp
├── .env
├── .gitignore
├── index.js
├── package-lock.json
├── package.json
├── pnpm-lock.yaml
├── README.md
├── src
│ ├── app.js
│ ├── config
│ │ └── database.js
│ ├── controllers
│ │ ├── category.controller.js
│ │ └── products.controller.js
│ │ └── suppliers.controller.js
│ ├── models
│ │ ├── category.model.js
│ │ └── product.model.js
│ │ └── supplier.model.js
│ ├── routes
│ │ ├── category.route.js
│ │ └── products.routes.js
│ │ └── suppliers.routes.js
│ ├── server.js
│ └── services
│ ├── category.service.js
│ ├── products.service.js
│ └── suppliers.service.js
routes: define endpoints HTTP.controllers: recibe request/response y coordina la logica.services: contiene reglas de negocio y validaciones.models: define esquema Mongoose para MongoDB.config: maneja la conexion a Atlas.app.js: arma la aplicacion Express y maneja rutas, 404 y errores simples.
La aplicacion responde con:
404cuando la ruta no existe.400para errores de validacion de Mongoose o IDs invalidos.500para errores internos no previstos.
npm run devSalida esperada:
[nodemon] starting `node src/server.js`
Server listening on http://localhost:3000
Base URL: http://localhost:3000
GET /: estado de la API
GET /api/categories: listar categoriasGET /api/categories/:id: obtener categoria por ID (ObjectId de Mongo)POST /api/categories: crear categoriaPUT /api/categories/:id: actualizar categoria por IDDELETE /api/categories/:id: eliminar categoria por ID
Request
{
"name": "Electronics",
"description": "Electronic devices, components, and accessories for inventory management."
}Response
{
"name": "Electronics",
"description": "Electronic devices, components, and accessories for inventory management.",
"isActive": true,
"createdAt": "2026-07-28T19:43:24.882Z",
"updatedAt": "2026-07-28T19:43:24.882Z",
"id": "6a69065c4f85c88df549ca00"
}GET /api/products: listar productosGET /api/products/:id: obtener producto por ID (ObjectId de Mongo)POST /api/products: crear productoPUT /api/products/:id: actualizar producto por IDDELETE /api/products/:id: eliminar producto por ID
Request
{
"name": "Wireless Noise-Canceling Headphones",
"price": 149.99,
"stock": 45,
"categoryId": "6a69065c4f85c88df549ca00",
"supplierId": "6a690d2fa1c1b3a868df86a6"
}Response
{
"name": "Wireless Noise-Canceling Headphones",
"price": 149.99,
"stock": 45,
"categoryId": "6a69065c4f85c88df549ca00",
"supplierId": "6a690d2fa1c1b3a868df86a6",
"createdAt": "2026-07-28T20:15:29.972Z",
"updatedAt": "2026-07-28T20:15:29.972Z",
"id": "6a690de1a1c1b3a868df86aa"
}GET /api/suppliers: listar proveedoresGET /api/suppliers/:id: obtener proveedor por ID (ObjectId de Mongo)POST /api/suppliers: crear proveedorPUT /api/suppliers/:id: actualizar proveedor por IDDELETE /api/suppliers/:id: eliminar proveedor por ID
Request
POST /api/suppliers
{
"name": "PostMan",
"email": "postmanexample@gmail.com",
"phone": "88881111",
"address": "Right on the corner."
}Response
{
"name": "PostMan",
"email": "postmanexample@gmail.com",
"phone": "88881111",
"address": "Right on the corner.",
"createdAt": "2026-07-28T20:12:31.572Z",
"updatedAt": "2026-07-28T20:12:31.572Z",
"id": "6a690d2fa1c1b3a868df86a6"
}