El primer paso para implementar un proyecto moderno es la construcción de un API REST que podemos consumir desde una aplicación web o móvil.
Una API RESTful es un conjunto de operaciones bien definidas que se aplican a todos los recursos de información: HTTP en sí define un conjunto pequeño de operaciones, las más importantes son POST, GET, PUT y DELETE. Con frecuencia estas operaciones se equiparan a las operaciones CRUD en bases de datos (ABMC en castellano: crear,leer,actualizar,borrar) que se requieren para la persistencia de datos, aunque POST no encaja exactamente en este esquema.
1- Crear proyecto e inicializarlo (Para obtener más información y ayuda con este paso ingresar a: Link)
$ mkdir nodejs-apirest $ cd nodejs-apirest
$ npm init
$ npm install express
El primer código que necesitamos modificar en una aplicación basada en Node.js es el archivo package.json. Éste archivo nos indica que dependencias vamos a utilizar en ella. Este archivo va en el directorio raíz de la aplicación:
{ "name": "nodejs-apirest", "version": "1.0.0", "dependencies": { "body-parser": "~1.13.2", "express": "~4.13.1", "method-override": "^2.1.2", "mongoose": "~3.6.11" } }
Posteriormente debemos de descargar las dependencias:
$ npm install
2- Servidor Node.js
Ahora deben de crear el archivo app.js (en la raíz del proyecto) y dejarlo así:
var express = require('express'); var bodyParser = require('body-parser'); var mongoose = require('mongoose'); var methodOverride = require("method-override"); var app = express(); // Middlewares app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()); app.use(methodOverride()); var router = express.Router(); // Index router.get('/', function(req, res) { res.send("Hola Mundo - www.programacion.com.py"); }); app.use(router); // Start server app.listen(3000, function() { console.log("Node server running on http://localhost:3000"); });
Explicación de que hace el código:
-bodyParser: Permite parsear JSON.
-methodOverride: Permite implementar y personalizar métodos HTTP.
Para ejecutar dicho código sólo tienes que escribir en consola lo siguiente y abrir un navegador con la url http://localhost:3000
$ node app.js
3- Crear modelo
Seguimos con la parte de la creación del modelo, utilizaremos Mongoose. Utilizaremos MongoDB: es la base de datos NoSQL líder y permite a las empresas ser más ágiles y escalables.
Para este tutorial crearemos una base de datos de clientes, para eso creamos el modelo cliente (models/client.js):
var mongoose = require('mongoose'); var Schema = mongoose.Schema; var clientSchema = new Schema({ name: { type: String }, email: { type: String }, genre: { type: String, enum: ['male', 'female'] } }); module.exports = mongoose.model('Client', clientSchema);
Con esto ya podemos implementar la conexión a la base de datos en el archivo app.js
añadiendo las siguientes líneas:
mongoose.connect('mongodb://localhost/clients', function(err, res) { if(err) throw err; console.log('Connected to Database'); });
Para que todo lo que está arriba funcione en nuestro entorno local, necesitamos tener instalado MongoDB, para eso ingresar a la: documentación oficial.
Ya tenemos todo configurado y listo para guardar y utilizar los datos, sólo nos queda crear las rutas que definirán las llamadas a la API.
3- Crear controlador
Seguimos con la parte de la creación del controlador (controllers/client.js):
var mongoose = require('mongoose'); var Client = mongoose.model('Client'); //GET - Return all registers exports.findAll = function(req, res) { Client.find(function(err, clients) { if(err) res.send(500, err.message); console.log('GET /clients') res.status(200).jsonp(clients); }); }; //GET - Return a register with specified ID exports.findById = function(req, res) { Client.findById(req.params.id, function(err, client) { if(err) return res.send(500, err.message); console.log('GET /clients/' + req.params.id); res.status(200).jsonp(client); }); }; //POST - Insert a new register exports.add = function(req, res) { console.log('POST'); console.log(req.body); var client = new Client({ name: req.body.name, email: req.body.email, genre: req.body.genre }); client.save(function(err, client) { if(err) return res.send(500, err.message); res.status(200).jsonp(client); }); }; //PUT - Update a register already exists exports.update = function(req, res) { Client.findById(req.params.id, function(err, client) { client.name = req.body.name; client.email = req.body.email; client.genre = req.body.genre; client.save(function(err) { if(err) return res.send(500, err.message); res.status(200).jsonp(client); }); }); }; //DELETE - Delete a register with specified ID exports.delete = function(req, res) { Client.findById(req.params.id, function(err, client) { client.remove(function(err) { if(err) return res.send(500, err.message); res.json({ message: 'Successfully deleted' }); }); }); };
Ahora tenemos que unir estas funciones del controlador a las peticiones que serán nuestras llamadas desde el API. Para eso debemos de editar el archivo app.js
y declaramos las rutas, el archivo queda así:
var express = require('express'); var bodyParser = require('body-parser'); var mongoose = require('mongoose'); var methodOverride = require("method-override"); var app = express(); // Connection to DB mongoose.connect('mongodb://localhost/clients', function(err, res) { if(err) throw err; console.log('Connected to Database'); }); // Middlewares app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()); app.use(methodOverride()); // Import Models and Controllers var models = require('./models/client')(app, mongoose); var ClientCtrl = require('./controllers/clients'); var router = express.Router(); // Index - Route router.get('/', function(req, res) { res.send("Hola Mundo - www.programacion.com.py"); }); app.use(router); // API routes var api = express.Router(); api.route('/clients') .get(ClientCtrl.findAll) .post(ClientCtrl.add); api.route('/clients/:id') .get(ClientCtrl.findById) .put(ClientCtrl.update) .delete(ClientCtrl.delete); app.use('/api', api); // Start server app.listen(3000, function() { console.log("Node server running on http://localhost:3000"); });
4- Probar
A continuación voy a utilizar una extensión de Google Chrome llamada Postman para probar el API.
Antes de probarlo, debemos tener mongodb y el servidor node.js de nuestra app corriendo. Una vez hecho esto introducimos los siguientes datos para hacer una llamada POST que almacene un registro en la base de datos.
Method: POST URL: http://localhost:3000/api/clients Body, utilizando "X-www-form-urlencoded":
Luego pulsamos send, el resultado debe ser el siguiente:
Ahora vamos a comprobar que se ha guardado correctamente, para eso podemos enviar un request GET, a la url: http://localhost:3000/api/clients, el resultado debe de ser:
Como pueden observar hay un registro con el id 5846ace82d6973ec1c000006, podemos recuperar ese registro enviando un request GET, a la url: http://localhost:3000/api/clients/5846ace82d6973ec1c000006 , el resultado debe de ser:
Ahora vamos a probar editar el registro con el id 5846ace82d6973ec1c000006, para eso enviamos un request PUT, a la url: http://localhost:3000/api/clients/5846ace82d6973ec1c000006, el resultado debe de ser:
Por último vamos a probar borrar el registro con el id 5846ace82d6973ec1c000006, para eso enviamos un request DELETE, a la url: http://localhost:3000/api/clients/5846ace82d6973ec1c000006, el resultado debe de ser:
Con esto tendríamos el funcionamiento básico de un API RESTful con Node.js y MongoDB. Como puedes ver es bastante sencillo ya que se utiliza Javascript, como lenguaje de servidor (Node), como formato de datos (JSON) y como base de datos (MongoDB).
Descargar proyecto completo: