API REST con Node.Js, Express, MongoDB y moongose.js

RESTfulAPI

En este artículo/tutorial  explicaremos como construir una API REST usando para ello Node.js y Express.js, junto con  MongoDB y el plugin para conectarnos a ella y mapear los modelos Mongoose.js.

El ejemplo en el que trabajaremos será el de una tienda online de camisetas. En principio, vamos a crear una aplicación que cumpla los casos CRUD (Create/Read/Update/Delete) para ver/crear/editar/borrar las camisetas de la tienda.

El proceso será el siguiente:

  • Montar el servidor Node.js junto con Express
  • Crear el modelo de las camisetas en MongoDB
  • Conectarnos a la base de datos
  • Construir la RESTful API implementando los casos CRUD
  • Probar que todo sirve utilizando Postman

En una futura entrega veremos algunos extras, como son:

  • Error handling
  • Buenas prácticas en nuestro código
  • Búsquedas con filtros

Node.js + Express.js, simple web server

Antes de empezar, necesitamos tener Node.js instalado en nuestro ordenador. Para ello simplemente entramos en la página de Node, descargamos e instalamos.

Una vez instalado, lo primero que haremos será crearnos una carpeta con el nombre del proyecto y acceder a ella.

Una vez dentro, lo primero que tendremos que hacer será crear un archivo con el nombre Package.json en el directorio raíz de nuestra carpeta. En dicho archivo indicaremos que dependencias vamos a utilizar. En principio, necesitamos express y mongoose. Tendremos que poner dentro el siguiente código:

Ahora que hemos especificado nuestras dependencias, tendremos que poner en la consola el siguiente comando:

NPM  es el gestor de paquetes de Node y se encargará de instalar las dependencias.

Ahora creamos un fichero llamado server.js en el directorio raíz, que será el que ejecute nuestra aplicación y arranque nuestro servidor. En primer lugar crearemos un sencillo servidor para comprobar que tenemos todo lo necesario instalado, y a continuación iremos ampliando las funcionalidades.

En este código las primeras líneas se encargan de incluir las dependencias que vamos a usar, algo así como los includes en C o PHP, o los import de Python. Con app.configure estamos configurando la aplicación para que pueda realizar métodos REST (Post, Get, etc..),  parsear JSON e implementar y personalizar métodos HTTP. Por último app.router nos permite crear rutas personalizadas. A continuación, hemos codificado un GET del navegador, de forma que cuando entremos en nuestra rootpage (“/”) nos muestre la frase “Hello World”.

Para ejecutar este pequeño código sólo tenemos que arrancar el servidor en la consola con el comando noder server.js y abrir un navegador accediendo a http://localhost:3000.

node_hello_world

Y con esto tenemos un servidor Node.js corriendo y respondiendo al método GET en la ruta principal “/”.

MongoDB & Mongoose.js. Creando el modelo de las camisetas.

Ahroa vamos a crear un modelo usando Mongoose para poder guardar la información en la base de datos siguiendo. Como base de datos vamos a utilizar MongoDB. MongoDB es una base de datos Open Source NoSQL orientada a documentos tipo JSON, lo cual nos viene que ni pintado para entregar los datos en este formato en las llamadas a la API. Si queréis, antes de continuar, podéis aprender mucho sobre MongoDB en uno de nuestros anteriores posts.

Para este ejemplo vamos a crear una base de datos de camisetas. Para ello, crearemos una carpeta models (dónde guardaremos nuestros modelos) y dentro de ella crearemos un fichero tshirt.js (nuestro modelo de camiseta). Por tanto, vamos a crear un modelo en models/tshirt.js que incluya la información de una camiseta, como pueden ser su modelo, sus imágenes, su estilo, su talla, su color, su precio o una descripción. Además, vamos a incluir una validación que nos imponga poner un nombre de modelo cuando creemos un documento de tipo camiseta. Veamos el código:

Conectarnos a la base de datos

Ahora es el momento de crear la conexión en la base de datos y de ver que podemos acceder bien a ella. Para ello, añadiremos al fichero server.js la dependencia mongoose = require(“mongoose”), y la conexión. Veamos el código:

Para que esto funcione en nuestro entorno local, necesitamos tener instalado MongoDB. Dependiendo de vuestro sistema operativo de hace de una forma u otra. Aquí teneís la documentación oficial.

Si ya tenemos MongoDB instalado y queremos comprobar que nuestra aplicación es capaz de conectarse a la base de datos, lo primero que tenemos que hacer es arrancar el servidor de mongo en nuestra terminal. Para ello, yo lo que hago es abrir una nueva pestaña en mi terminal, ir a la ubicación dónde tengo mis binarios de MongoDB y arrancar el servidor. Os pongo una captura de mi terminal y el comando que ejecuto:

mongo_terminal

Con Mongo arrancado ya podemos ejecutar la aplicación con “node server.js” desde la terminal, si todo va bien veremos lo siguiente en el terminal:

RESTful API. Casos CRUD.

Vamos a crear las rutas en la carpeta routes, concretamente en un fichero dentro de ella llamado tshirts.js. Esto lo hacemos así para mantener la modularidad.

Con la llamada a module.exports conseguimos modularizarlo y que pueda ser llamado desde el archivo principal de la aplicación.

Veamos un esquema del código para que quede claro lo que vamos a hacer y a continuación entraremos más en detalle.

En primer lugar dejamos planteados los casos CRUD a los que va a responder nuestra RESTful API. En la parte final vemos los métodos de acceso y las rutas, así como las funciones previas a las que vamos a llamar. Me gusta dividir el código así para poder ver de una visual que rutas tengo parseadas.

Para rellenar todas las funciones debemos conocer MongoDB, de manera que sepamos:

  • //GET – Return all tshirts in the DB. Utilizamos la función .find() que nos devuelve toda la colección de tshirts almacenada en formato JSON
  • //GET – Return a Tshirt with specified ID. Utiliza findById()
  •  //POST – Insert a new Tshirt in the DB. Primero creamos un nuevo objeto tshirt siguiendo el patrón del modelo, recogiendo los valores del cuerpo de la petición, lo salvamos en la base de datos con el comando .save() y por último lo enviamos en la respuesta de la función.
  • //PUT – Update a register already exists.

    Podremos actualizar un registro a partir de un ID. Primero buscamos en la base de datos el registro dado el ID, y actualizamos sus campos con los valores que trae el cuerpo de la petición. Comprobamos primero que los campos no sean nulos para evitar sobreescribir con valores vacíos, ya que estamos utilizando el método save en lugar de update. El motivo de hacer esto es que con el método save podemos comprobar los errores de validación, mientras que con el método update no es posible. También usa el método findById()

  • //DELETE – Delete a Tshirt with specified ID. Como veremos, también usa el método findById()

Además, dentro de los métodos:

  • hemos controlado los posibles errores que pudiéramos encontrar y los devolvemos
  • devolvemos el statusCode (500, 400, 404, 200)
  • incluimos los mensajes en la consola
  • comprobamos que si se intenta acceder a un documento con in ID, estdocumento exista
  • comprobamos que al insertar o actualizar un documento, se cumpla la validación de que tiene que existir un nombre de modelo y además no puede estar en blanco. Si no fuera así, informamos de que no se cumple la validación

Muy bien, vamos a ver como quedaría el código.

Y ya sólo nos faltaría enlazar este módulo al archivo princiap en el fichero  server.js. Simplemente añadiremos:

Por si tienes dudas de dónde colocarlo:

Probando con Postman

Para hacer las pruebas debemos:

  • Arrancar el servidor MongoDB en el terminal. $ ./mongod –dbpath /Users/pb/Desarrollo/mongodb/data/db
  • Arrancar el servidor node en otra ventana del terminal. node server.js
  • Instalar Postman en Google Chrome
  • Arrancar la consola de MongoDB

Probando GET “/”

node_ prueba 1

Probando GET “/tshirts” por primera vez

Como de momento no hemos agregado ningún documento, si tratamos de acceder a la lista de camisetas, veremos que no hay ninguna:

node_prueba2

Podemos comprobarlo también en nuestra consola de MongoDB, la cual hemos arrancado en una nueva ventana del terminal con el comando ./mongo.  Vemos que existe la base de datos, pero que está vacía:

Más adelante volveremos a este método. Primero, vamos a crear algunos documentos.

Probando POST /tshirt – Creando una camiseta

–> Si tratamos de crear una camiseta sin parámetro modelo o con dicho parámetro pero con valor “”, nos devuelve:

node_prueba3

Podemos verlo también en nuestra consola de node:

–> Si lo hacemos de forma correcta:

node_prueba4

Podemos acceder a nuestra consola de MongoDB, y ver que este objeto también se ha creado correctamente:

Ahora voy a crear una serie de camisetas nuevas para poder seguir haciendo pruebas.

Probamos de nuevo GET /tshirts- ahora ya hay camisetas

node_prueba5

También podemos verlo en nuestra consola de MongoDB

Probando GET /tshirt/:id

Para ello debemos pasar como parámetro un id. Hemos visto que dicho ID se encuentra en el campo “_id”. Vamos a coger la primera camiseta que creamos, que tiene _id = 53203819a781163907000004

node_prueba6

También podemos hacer la búsqueda en nuestro terminal:

 

Probando PUT /tshirt/:id – Actualizando una camiseta

–> Si tratamos de actualizar una camiseta que no existe

node_prueba7

–> Si tratamos de actualizar con el modelo en blanco “”:

node_prueba8

–> Si actualizamos de manera correcta:

node_prueba9

Y también podemos ver en nuestro terminal que se ha actualizado correctamente.

Probando el método DELETE /tshirt/:id

node_prueba10

 

Y también vemos en el terminal que ya no existe el documento.

================================================

Podéis descargar todos los ficheros desde GitHub.

Si queréis seguir trabajando en ello, el siguiente paso sería controlar el acceso. Para ello se utiliza OAuth 2.0 con ayuda de OAuth2orize y Passport.js.

Y esto ha sido todo por el momento!


3 Comments

  • Responder Isidro |

    Huy! me ha resultado muy útil este post, los tuve que hacer pequeños ajustes, como:
    -El comando “node server.js” para ejecutar la aplicación ya es obsoleta ahora se recomienda usar npm start para favorecer un sistema esquelético.
    -Cuando declaraste el Schema Tshirt pusiste “require” en lugar de “required”
    -Por alguna extraña razón Postman no envía los valores POST por “form-data” sólo por “x-www-form-urlencoded” y de forma manual creando un formulario con html

    Saludos! muchas gracias :D

So, what do you think ?