Crud con node.js. Express rest api.
En este post vamos a desarrollar un crud con node.js. Usaremos sequelize para conectar con la base de datos. Esto nos permitirá conectar tanto con mysql como con sqlite. Tan solo será necesario cambiar una línea en la configuración de
¿Por qué desarrollar un crud con node.js?
Es muy probable que, cuando estés desarrollando una aplicación web, necesites consumir recursos procedentes de una base de datos. Crear, Leer, Actualizar y Borrar registros de la misma. Antiguamente, todo ese entramado lo montaba con Apache, PHP con PDO y Mysql. Pero a medida que he ido profundizando en Javascript del lado del servidor he visto que no. Me he dado cuenta que, para desplegar una aplicación en producción, no es necesario un servidor web tan grande como Apache. Porque es tan glotón que pude llegar a cepillarse el 80% de los recursos del equipo en el que habita.
Implementar un crud con node.js es mucho más eficiente. No necesitas un servidor apache ni un equipo con grandes especificaciones. Incluso una simple Raspberry pi te puede servir
Desarrollando nuestro crud
Basándonos en el diseño de la aplicación de control de competiciones que estamos montando, vamos a ver como podemos montar un CRUD completo haciendo uso de node.js, Express y Sequelize. Para simplificar las cosas, vamos a ver como montar el CRUD con node.js para el modelo de datos «Temporadas». Si recuerdas ya vimos su definición en una entrada anterior.
Para responder a las peticiones del CRUD, vamos a añadir dos simples líneas a nuestra archivo index.js. Y después vamos a crear un archivo que se encargue de gestionar esas rutas. Las líneas que añadiremos serán:
var temporadasrouter=require('./rutas/temporadas.js').rutas; app.use('/api/v1/temporadas',temporadasrouter);
De estas manera, todas las rutas que se correspondan con el patrón «/api/v1/temporadas» las va a gestionar el archivo temporadas.js. Este tendrá la siguiente estructura:
var express = require('express'); var auth = require('basic-auth'); var jwt = require('jsonwebtoken'); var config = require('./../config/config.json'); var rutas = express.Router(); var Temporada = require('./../modelos').Temporada; rutas.post('/', VerificarToken, function(req, res) { var t = req.body.temporada; console.log(t); Temporada.create(t).then(() => { res.status(200).end('Temporada grabada correctamente'); }).catch(err => { console.log(err); res.status(500).json(err); }) }); rutas.get('/:id?', VerificarToken, function(req, res) { if (req.params.id){ Temporada.findById(req.params.id).then(temporada => { res.status(200).json(temporada); }) .catch(err => { console.log(err); }); } else { Temporada.findAll().then(temporadas => { //console.log(temporadas); res.status(200).json(temporadas); }); } }); rutas.delete('/:id', VerificarToken, function(req, res) { console.log(req.params.id); Temporada.findById(req.params.id).then(temporada => { temporada.destroy(); res.status(200).end(); }) .catch(err => { console.log(err); }); }); rutas.put('/:id', VerificarToken, function(req, res) { console.log(req.body.temporada); var t = req.body.temporada; console.log(req.params.id); Temporada.findById(req.body.temporada.id).then(temporada => { temporada.updateAttributes(t); console.log(temporada.dataValues); temporada.save().then(() => { res.status(200).end("Temporada actualizada"); }) }) .catch(err => { console.log(err); }); }); function VerificarToken(req, res, next) { var token = req.headers.authorization.replace('Bearer ', ''); console.log(token); jwt.verify(token, config.secret, function(err, decoded) { if (!err) { next(); } else { console.log(err); res.status(401).end(); } }); } exports.rutas = rutas;
Verbos http en nuestro crud
Haciendo uso de los verbos HTTP (post,get, put y delete) ejecutaremos cada una de los métodos del CRUD. Así que vamos viéndolos por partes.
Para crear una temporada, en el lado del cliente tenemos el siguiente método:
$scope.NuevaTemporada = function() { console.log($scope.temporada); $http.post(CONFIG.APIURL + '/api/v1/temporadas', { temporada: $scope.temporada }) .then(data => { console.log(data); $('#exito').text('Temporada creada correctamente'); $scope.exito = true; $timeout(function () { $scope.exito = false; $scope.temporada = {}; $scope.GetTemporadas(); }, 1500); }, err => { console.log(err.data.message); $('#error').text(err.data.message); $scope.fracaso = true; setTimeout(() => { $scope.$apply(() => { $scope.fracaso = false; $scope.temporada = {}; }); }, 1500); //$timeout($scope.fracaso=false, 1500); }) }
En él, hacemos una petición POST, en cuyo cuerpo enviamos los datos necesarios para crear una nueva temporada (nombre y descripción). Esta petición se traspsa a nuestro fichero «temporadas.js», que coge el objeto Temporada del body y mediante el método create de Sequelize lo graba en la base de datos.
Para actualizar, desde el lado del cliente enviamos un objeto Temporada mediante el verbo PUT, referenciado por su id. Recogemos el objeto, lo buscamos por id con Sequelize, lo que nos devuelve un objeto Temporada. Este posee con un método updateAttributes(), que es al que pasamos el objeto temporada que hemos enviado. Después Sequelize se encarga de actualizar los datos que varían.
Para borrar, enviamos mediante DELETE la id del objeto a borrar. Buscamos la temporada con el método findById, que nos devuelve un objeto temporada. Llamamos al método destroy() de sequelize y lo eliminamos de nuestra base de datos.
Por último, para cerrar el círculo del CRUD, tenemos el verbo GET. Este nos devuelve todas las temporadas cuando lo invocamos sin parámetro. Y si le pasamos el parámetro id, nos devuelve esa temporada en concreto.
Hasta aquí este tutorial de programación de un crud con node.js. Espero que te haya sido de utilidad. Si tienes duda, te invito a usar los comentarios. Prometo resolverlas.