Este artículo analizará cómo podemos manejar las rutas de un API dentro de un proyecto Nodejs usando Express. Comenzaremos con un nuevo proyecto Express y lo mejoraremos progresivamente desde cero.

¿Qué es una ruta?

Las rutas son formas en las que podemos manejar las solicitudes del usuario hacia los recursos de nuestra API. Por ejemplo, si queremos saludar a un usuario con un “Hola Mundo!” en una ruta, podemos hacer algo como esto:

const express = require('express')
const app = express()

app.get('/', function (request, response) {
  response.send('Hola mundo!')
})

En este segmento de código configuramos la ruta raíz para que responda con el texto “Hola mundo!”. Claro que en este ejemplo, por ser el primero, nos estamos limitando. Realmente podemos usar los verbos HTTP como post, put, delete, merge, patch.

Por lo tanto, también podemos manipular la parámetros del callback request y response, para dar un código de respuesta diferente (2xx, 3xx, 4xx o 5xx)

Para definir otra ruta, basta con definiría como un string de la siguiente forma.

const express = require('express')
const app = express()

app.get('/', function (request, response) {
  res.send('Hola Mundo!')
})

app.get('/adios', function (request, response) {
  response.send('Adios Mundo!')
})

El proyecto y sus dependencias

Para realizar una API en express debemos crear un proyecto con npm e instalar algunas dependencias que nos ayudarán a realizar tan noble labor 🙂

# Primero creamos un directorio para nuestro proyecto
$ mkdir api-ejemplo

# entramos al directorio que creamos
$ cd api-ejemplo

# Inicializamos el proyecto con npm y todos sus defaults
$ npm init -y

# Creamos el archivo principal
$ touch index.js

# Instalamos express de forma que este contenido en el proyecto
$ npm install express --save
# Y nodemon como dependencia de desarrollo
# Nodemon nos ayuda a desarrollar sin tener que reiniciar la
# aplicación cada vez que hacemos un cambio
$ npm install -D nodemon

Y si ahora corremos un npm start estamos listos para trabajar!

Rutas

Para que nuestra aplicación este siempre escuchando las solicitudes de los usuarios es necesario especificar un puerto sobre el cual escuchar. Por lo general se trata del puerto 80. Normalmente si corren la aplicación en un puerto inferior al puerto 1024 necesitaran ser root para ejecutar la aplicación.

const express = require('express');

const app = express();
const PORT = 3000;

app.listen(PORT, () => 
   console.log(`Express corre en el puerto ${PORT}`));

Es recomendable que el puerto sea configurable como variable de entorno.

Entonces para acceder a las rutas expuestas anteriormente hay que acceder al puerto 3000 en un navegador con la ruta especificada.

  • localhost:3000/
  • localhost:3000/adios

Miremos un ejemplo mas complejo con tipos de respuesta específicos y códigos de estado http.

let cuentas = [];

app.get(`/cuentas`, (request, response) => {
  response.json(cuentas);
});

app.get(`/cuentas/:id`, (request, response) => {
  const idCuenta = Number(request.params.id);
  const getCuenta = await accounts.find((cuentas) => cuentas.id === idCuenta)
  .catch((error) => {
     response.status(500).send('Error en el servidor al buscar cuenta')
  })

  if (!getCuenta) {
    response.status(404).send('Cuenta no encontrada.')
  } else {
    response.json(getAccount);
  }
});

Aquí en la primera ruta asumimos que el arreglo cuentas contiene información sobre algunas cuentas en un sistema hipotético y las regresamos al usuario en formato json.

En la segunda ruta obtenemos una cuenta especifica con un id y el método get. Si el método “find” no logra encontrar las cuentas y regresa una excepción nosotros devolvemos un estatus 500 que significa que el servidor fallo al realizar la búsqueda. Si por el contrario el método find no regreso ninguna excepción pero el arreglo esta vacío entonces necesitamos el famoso 404 que significa que no se encontró ninguna cuenta. Finalmente si las cuentas fueron encontradas las regresamos con formato json, por defecto el estatus es 200OK si no lo cambiamos.

Verbos

Cuando creamos una API es importante tener en cuenta que los verbos correspondan a la acción que estamos realizando. Han sido ya muchas las veces que escucho cosas como: “Tienes que poner todo en POST para que sea mas seguro”…. esto es lo que pienso de eso:

Para que tu API sea mas segura no pones todo en ‘POST’… implementas métodos de autenticación, encriptas los resultados y diseñas una infraestructura que no permita a un atacante revelar tus secretos. Los verbos son inofensivos.

Rant off. Aquí hay una lista de verbos HTTP y como los podemos usar correctamente en el desarrollo de nuestra aplicación.

  • GET usarlo cuando necesitamos leer datos sobre algún recurso. Como su nombre lo indica, es para “obtener” cosas.
  • POST lo usamos cuando queremos escribir datos nuevos o crear recursos. Como su nombre lo indica sirve para “publicar” cosas.
  • DELETE Lo usamos cuando necesitamos borrar algún recurso, justo como lo indica su nombre.
  • PUT usamos este verbo cuando queremos actualizar un recurso que sabemos que existe. Como por ejemplo cuando queremos actualizar el recurso /articulo/123 que previamente habíamos creado con un POST.
  • PATCH Usamos este verbo cuando queremos actualizar solo una parte del recurso en cuestión. Como por ejemplo, queremos editar solo el titulo de /articulo/123

Códigos de estado

Como vimos en el ejemplo, se tiene varios códigos de estado. Aquí hay un truco simple para recordar a grandes rasgos que es lo que significan:

  • 2xx Todo ha salido bien felicidades!
  • 3xx Eso que buscas se ha movido de lugar
  • 4xx El usuario la ha cagado!
  • 5xx El servidor la ha cagado!

Cualitativamente todo arriba de 400 es error, y todo abajo de 400 es éxito.

Conclusión

NodeJS y express hacen una poderosa combinación para escribir API a velocidades extremas! pero con un gran poder viene una gran responsabilidad y necesitamos aplicar las mejores practicas de desarrollo y protocolos estándar para el desarrollo correcto de las mismas.

Categorized in:

Tagged in:

, , , ,