Creando un API REST con node.js y mongodb

Trabajar construyendo APIS es la forma más moderna y actual de desarrollar software de una forma eficiente. En este artículo os enseñare a construir un API rest usando express, un framework basado en node.js y mongoose un ODM para trabajar con la base de datos mongodb.

Instalación de componentes

Antes de lanzarnos a programar debemos instalar las dependencias, no voy a entrar mucho en detalle pero os indicaré los componentes a descargar y que guías seguir.
  1. Mongodb: Es la base de datos que utilizaremos, es una base de datos NOSQL que nos permite realizar aplicaciones de una forma muy ágil. Las instrucciones de cómo descargarla e instalarla las encontrareis en su página web, pinchando aquí .
  2. Express.js: Express es un framework basado en node.js que nos facilitará muchísimo nuestro trabajo. Podéis seguir las instrucciones de descarga aquí. También os recomiendo instalar su herramienta de generación de proyectos, con la orden npm install express-generator -g.

Creación de estructura básica

Una vez que tenemos instalado express así como su herramienta, ejecutamos la orden express exampleApiMongodb, que nos creará la carpeta exampleApiMongodb con la estructura de un proyecto de express.Este comando ya nos genera una aplicación base que arranca perfectamente usando la orden npm start. El código base para el arranque de la aplicación se encuentra en el archivo app.js, por lo que no os recomendaría modificar este archivo salvo para añadir alguna dependencia

Definición de modelos y conexión a base de datos

Antes de nada, instalamos nuestro ODM Mongoose con la orden npm install mongoose --save.

En el archivo app.js incluimos las siguientes líneas de código, que nos permitirán conectar con la base de datos mongodb.

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/database', { useNewUrlParser: true });

Después, comprobamos que nuestra conexión es correcta, de la siguiente forma:

const db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', () => {

 console.log(`succesfully connection to database`);

});
Creamos el directorio models y dentro generamos un archivo person.js con el siguiente código:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const PersonSchema = new Schema(
{
    displayName:
    {
        type:String,
        required:true,
        minlength:3
    },
    phone:
    {type:String},
    pic:
    {type:String},
    mail:
    {type:String}
});
module.exports = mongoose.model('Person', PersonSchema);
En este caso hemos definido un modelo Person con los campos displayName, phone, pic y mail, hemos marcado displayName como campo requerido y que tenga una longitud mínima de 3 caracteres

Definición de rutas

Las rutas definirán los path a los que se podrá llamar de nuestra aplicación y en ellas se encontrará la lógica a ejecutar. Creamos dentro de la carpeta routes un archivo person.js con el siguiente código:
const Person = require('../models/person');
router.get('/:id', async (req, res, next) =>
{

  try{
    const person = await Person.findById({'_id':req.params.id});
  catch(error) {
    //handling error
  }
   
});
module.exports = router;
Como podemos ver en la primera línea lo que hacemos es importar el modelo Person, luego definimos una ruta del estilo ‘/:id’ en donde id será el identificador a buscar.Dentro de la ruta llamamos al método findById con el id recibido y devolvemos el resultado en formato JSON.

El método findById de mongoose nos buscará en la colección de personas aquella cuyo campo interno '_id' coincida con el suministrado.

Por último, cargamos las rutas en la aplicación, añadiendo estas lineas al archivo app.js:
const personRoute = require('./routes/person');
app.use('/person', personRoute);
En este código cargamos la ruta anterior definiendo el path /person como ruta de acceso a sus métodos.

¡ A probar !

Ahora ya podemos testear nuestra aplicación introduciendo en el navegador la siguiente url: “localhost:3000/person/{id}”, en donde {id} sería un identificador a consultar. Si consultáis la siguiente entrada, explicaré como proteger vuestras rutas de la aplicación mediante tokens JWT