Hoy aprenderemos a trabajar más con rutas y acciones del controlador y vamos a hacer un CRUD en NodeJS para nuestro servicio RESTful.
Lo primero que tenemos que hacer en nuestro controlador es importar el modelo de Nota:
var Nota = require('../models/nota');
Guardar en la base de datos
El primer método que crearemos nos servirá para guardar nuevos documentos de tipo Nota en nuestra base de datos de Mongo usando mongoose desde NodeJS.
function saveNota(req, res){ // Creamos el objeto Nota var nota = new Nota(); // Recogemos los datos que nos llegan por POST var params = req.body; // Comprobamos que nos llega el nombre if(params.nombre){ // Asignamos un valor a las propiedades del objeto Nota nota.nombre = params.nombre; nota.descripcion = params.descripcion; // Guardamos el documento en la base de datos nota.save((err, notaStored) => { // Si se produce un error lo devolvemos if(err) return res.status(500).send({message: 'Error en el servidor'}); // En el caso de que el documento se guarde tambien devolvemos el objeto guardado if(notaStored){ return res.status(200).send({ nota: notaStored }); }else{ return res.status(200).send({ message: 'No se ha guardado la nota' }); } }); }else{ return res.status(200).send({ message: 'El nombre de la fruta es obligatorio' }); } }
Listar todo
El segundo método que crearemos será el que nos devuelva una colección de objetos completa con todos los documentos que tenemos en nuestra colección de notas de la base datos.
function getNotas(req, res){ // Usamos el método find sobre nuesta entidad Nota y ordenamos los resultados Nota.find({}).sort({'_id':-1}).exec((err, notas) => { if(err) return res.status(500).send({message: 'Error en el servidor'}); // Devolvemos el resultado de la query en json if(notas){ return res.status(200).send({ notas }); }else{ return res.status(404).send({ message: 'No hay notas' }); } }); }
Devolver un documento
Ahora crearemos un método para nuestro CRUD en NodeJS que nos devuelva una sola nota.
function getNota(req, res){ // Recogemos un parametro por la url var notaId = req.params.id; // Buscamos por ID Nota.findById(notaId).exec((err, nota) => { if(err) return res.status(500).send({ message: 'Error en el servidor' }); // Devolvemos el resultado if(nota){ return res.status(200).send({ nota }); }else{ return res.status(404).send({ message: 'No existe la nota' }); } }); }
Actualizar
Una de las funcionalidades importantes en un CRUD es la actualización de los datos de un objeto concreto. Vamos a crear un método que nos permita hacer un update de los documentos de nuestra database.
function updateNota(req, res){ // Recogemos un parámetro por la url var notaId = req.params.id; // Recogemos los datos que nos llegen en el body de la petición var update = req.body; // Buscamos por id y actualizamos el objeto y devolvemos el objeto actualizado Nota.findByIdAndUpdate(notaId, update, {new:true}, (err, notaUpdated) => { if(err) return res.status(500).send({message: 'Error en el servidor'}); if(notaUpdated){ return res.status(200).send({ nota: notaUpdated }); }else{ return res.status(404).send({ message: 'No existe la nota' }); } }); }
Eliminar
Por último crearemos una función para poder borrar documentos de nuestra colección de Notas.
function deleteNota(req, res){ var notaId = req.params.id; // Buscamos por ID, eliminamos el objeto y devolvemos el objeto borrado en un JSON Nota.findByIdAndRemove(notaId, (err, notaRemoved) => { if(err) return res.status(500).send({ message: 'Error en el servidor' }); if(frutaRemoved){ return return res.status(200).send({ nota: notaRemoved }); }else{ return return res.status(404).send({ message: 'No existe la nota' }); } }); }
Exportar métodos
Para poder utilizar todas estas funciones fuera de este controlador tenemos que exportalas de la siguiente manera:
module.exports = { pruebas, saveNota, getNotas, getNota, updateNota, deleteNota };
Crear rutas en NodeJS
Por último debemos crear una ruta por cada método. Nuestro fichero de rutas quedaría así:
'use strict' var express = require('express'); var NotaController = require('../controllers/nota'); var api = express.Router(); api.get('/pruebas', NotaController.pruebas); // POST para guardar nuevos documentos api.post('/nota', NotaController.saveNota); // GET para conseguir documentos api.get('/notas', NotaController.getNotas); api.get('/nota/:id', NotaController.getNota); // PUT para actualizar documentos api.put('/nota/:id', NotaController.updateNota); // DELETE para eliminar documentos api.delete('/nota/:id', NotaController.deleteNota); module.exports = api;
Ya podemos utilizar todas estas URLs y probarlas con POSTMAN.
Con esto ya sabemos hacer un CRUD en NodeJS y tenemos hecha una pequeña API RESTful totalmente funcional.