Métodos

Los controladores de las rutas de nuestra API los vamos a crear en un archivo product.controller.js en el mismo definiremos los métodos de nuestros modelos que vamos a utilizar para la funcionalidad de carrito de compras, con el siguiente código.

api/product/product.controller.js
/**
 * Using Rails-like standard naming convention for endpoints.
 * GET     /api/products           ->  index
 * GET     /api/products/:id       ->  show
 * POSG    /api/products           ->  create
 */
 
const Product = require('./product.model');

// Gets a list of products
function index(req, res) {
  return Product.find().exec()
    .then(respondWithResult(res))
    .catch(handleError(res));
}

// Create product
function create(req, res) {
  return Product.create(req.body)
    .then(respondWithResult(res, 201))
    .catch(handleError(res));
}

// Gets a single product from the DB
function show(req, res) {
  return Product.findById(req.params.id).exec()
    .then(handleEntityNotFound(res))
    .then(respondWithResult(res))
    .catch(handleError(res));
}

module.exports = {
  create,
  show,
  index,
};

De esta manera tan sencilla, al llamar a la función index se envia como respuesta toda la colección de products almacenada y en formato JSON. Si queremos que sólo nos devuelva un registro con un identificador único, llamamos en este caso a la función show.

Por ultimo para crear un nuevo objeto producto siguiendo el patrón del modelo, recogiendo los valores del cuerpo de la petición, lo salvamos en la base de datos con la función create.

Vamos agregar tres funciones a este archivo que nos dará mejor legibilidad en el código al momento de responder a las promesas.

api/product/product.controller.js
function respondWithResult(res, code) {
  const statusCode = code || 200;
  return (entity) => {
    if (entity) {
      res.status(statusCode).json(entity);
    }
  };
}

function handleEntityNotFound(res) {
  return (entity) => {
    if (!entity) {
      res.status(404).end();
      return null;
    }
    return entity;
  };
}

function handleError(res, code) {
  const statusCode = code || 500;
  return (err) => {
    res.status(statusCode).send(err);
  };
}

Last updated