Implementa un CRUD completo para un recurso en Express con Mongoose: endpoints, estados HTTP correctos, manejo de errores y validación mínima.
CRUD completo: rutas Express y modelo Mongoose

Un CRUD completo suele ser el núcleo de una API: crear, leer, actualizar y borrar. Aquí el objetivo es hacerlo limpio: rutas claras, estados HTTP correctos y errores controlados.

1) Endpoints típicos

  • GET /events → listar
  • GET /events/:id → detalle
  • POST /events → crear
  • PUT /events/:id → reemplazar
  • PATCH /events/:id → actualizar parcial
  • DELETE /events/:id → borrar

2) Router separado

const express = require("express");
const router = express.Router();
const Event = require("../models/Event");

router.get("/", async (req, res) => {
  const items = await Event.find().sort({ date: 1 });
  res.json(items);
});

router.get("/:id", async (req, res) => {
  const item = await Event.findById(req.params.id);
  if (!item) return res.status(404).json({ error: "No encontrado" });
  res.json(item);
});

router.post("/", async (req, res) => {
  if (!req.body.title || !req.body.date) {
    return res.status(400).json({ error: "title y date son obligatorios" });
  }
  const created = await Event.create(req.body);
  res.status(201).json(created);
});

router.patch("/:id", async (req, res) => {
  const updated = await Event.findByIdAndUpdate(
    req.params.id,
    req.body,
    { new: true, runValidators: true }
  );
  if (!updated) return res.status(404).json({ error: "No encontrado" });
  res.json(updated);
});

router.delete("/:id", async (req, res) => {
  const deleted = await Event.findByIdAndDelete(req.params.id);
  if (!deleted) return res.status(404).json({ error: "No encontrado" });
  res.status(204).send();
});

module.exports = router;

3) Montar el router

app.use("/events", require("./routes/events"));

4) Errores y estados

  • 201 al crear
  • 404 si no existe el recurso
  • 400 si falta información
  • 204 al borrar (sin body)