· 5 min read

API REST with NodeJs and Express

We created a simple REST API exemplifying how a service would be created to manage movies.

We created a simple REST API exemplifying how a service would be created to manage movies.

Repository

Requirements

  • NodeJs
  • Npm

To start a new application with Nodejs you must first initialize the proyect, we will create a folder for this example we called “movies”

mkdir movies

We enter the directory that we just created.

cd movies

Once inside we start our project with the following command. When we execute this command we will be asked for some configuration parameters for the project. In our case we will use the “-y” flag to set all these parameters to their default values.

npm init -y

Se habrá generado un nuevo fichero llamado «package.json». En este fichero podemos ver que se especifican los parámetros que te comente antes si decidiste añadir el flag «-y» se habrán marcado los valores por defecto del proyecto.

{
  "name": "movies",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

Este fichero es donde se irán especificando todas las dependencias de la aplicación. Para este proyecto necesitaremos instalar las siguientes dependencias:

  • Express
  • Nodemon
  • Morgan

Con el siguiente comando instalamos tanto express que nos servirá para crear un servidor que responda peticiones http y morgan que nos permitirá hacer un seguimiento en la terminar de las peticiones que van llegando.

npm install express morgan

En un comando aparte instalaremos nodemon con el flag «-D» con esta opción nos permitira instalar nodemon como una dependencia de desarrollo ya que solo la utilizaremos cuando vayamos a ejecutar en local. Esta dependencia nos permite hacer cambios en nuestro servidor sin necesidad que reiniciar manualmente el servidor ya que esta continuamente observando cambios en el código y reiniciando el servidor por cada cambio guardado.

npm install -D nodemon

Una vez instaladas las dependencias podemos ver nuestro package.json se ha modificado. Ahora vemos que hay dependencies y devDependencies que es donde se listaran las dependencias de nuestro proyecto.

{
  "name": "movies",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.18.1",
    "morgan": "^1.10.0"
  },
  "devDependencies": {
    "nodemon": "^2.0.19"
  }
}

Ahora crearemos una carpeta dentro del proyecto que sera donde pondremos el código de nuestra aplicación. Con el siguiente comando creamos la carpeta y nos movemos dentro del directorio.

mkdir src && cd src

Ahora crearemos un archivo index.js que sera el fichero desde el cual iniciaremos nuestro servidor.

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

app.get('/', (req, res) => {
  res.json({ message: 'Hello world' });
});

app.use(express.json());

app.listen('3000', () => {
  console.log('Server on port 3000');
});

Si corremos el siguiente código deberíamos poder iniciar nuestro servidor.

node ./src/index.js

Y en la terminal nos mostrara el siguiente mensaje. Que es el mensaje que establecimos que se imprima una vez nuestro servidor este corriendo.

Ahora si entramos a nuestro navegador con la siguiente ruta

http://localhost:3000

Podremos ver que nos retorna con el mensaje de «Hello World» que configuramos como respuesta en nuestra ruta inicial.

{
  "message": "Hello world"
}

Lo que acabamos de hacer es crear un servidor que responde peticiones de tipo GET en la ruta / y nos retorne el clásico «Hello World». Exactamente es este fragmento de código que le indica a nuestro servidor como debe responder a peticiones de este tipo.

app.get('/', (req, res) => {
  res.json({ message: 'Hello world' });
});

De esta forma podemos añadir los tipos de petición que queramos GET, POST, PUT, DELETE con la ruta que nosotros queramos utilizar. Ahora podemos añadir una nueva ruta para poder listar nuestras películas. Recuerda reiniciar tu servidor para que los cambios aplicados en el código se apliquen.

app.get('/movies', (req, res) => {
  res.json([
    {
      id: 1,
      name: 'Nobody',
    },
    {
      id: 2,
      name: 'Dr No 1962',
    },
  ]);
});

Como se puede observar cuando hacemos una peticiones a http://localhost:3000/movies ahora nos responde el listado de películas que pusimos en nuestro código.

[
  {
    "id": 1,
    "name": "Nobody"
  },
  {
    "id": 2,
    "name": "Dr No 1962"
  }
]

Como nos habremos dado cuenta si por cada cambio que realicemos tenemos que reiniciar nuestro código desarrollar una aplicación puede ser bastante tedioso. Para ayudarnos en nuestro desarrollo usaremos la librería «nodemon«. Esta librería nos permitirá poder aplicar cambios en nuestro código y por cada cambio guardado reinicia nuestro servidor, esto es muy útil por que nos ahorra el trabajo engorroso de estar reiniciado nuestro servidor y nos permite ir detectando fallos de ejecución de nuestro código.

Para poder utilizar nodemon lo podemos hacer de dos formas instalarlo de manera global. Donde la principal ventaja que es podemos reutilizar esta misma dependencia para diferentes aplicaciones que estemos desarrollando en nuestro ordenador.

npm install nodemon -g

O instalarlo únicamente como una dependencia de desarrollo. Donde se puede dar el caso que solo queramos tenerlo para una aplicación especifica.

npm install nodemon -D

Dependiendo de como hayamos decidido instalarlo la manera de ejecutar nuestro código puede variar.

De la manera global ejecutamos nuestro servidor de la siguiente forma.

nodemon ./src/index.js

Y si lo corremos como dependencia de desarrollo lo ejecutamos de la siguiente forma.

./node_modules/nodemon/bin/nodemon.js ./src/index.js

Independientemente de como lo hayamos ejecutar obtendremos el siguiente resultado.

Como extra podemos añadir esto al apartado de “scripts” del “package.json”.

{
  "scripts": {
    "start": "node ./src/index.js",
    "dev": "nodemon ./src/index.js"
  }
}

Para tener mejor estructurado nuestro proyecto podemos separar nuestras rutas en un directorio aparte.

mkdir ./src/routes && touch ./src/routes/movies.js

Una vez tengamos creado nuestro fichero definiremos nuestras rutas utilizando el modulo de Routes que nos proporciona Express.

const { Router } = require('express');
const router = Router();

router.get('/movies', (req, res) => {
  res.json([
    {
      id: 1,
      name: 'Nobody',
    },
    {
      id: 2,
      name: 'Dr No 1962',
    },
  ]);
});

module.exports = router;

De esta manera estamos creando un modulo con nuestras rutas definidas. Ahora solo tenemos que decirle a Express que utilice nuestro modulo con nuestras rutas.

//Routes movies
app.use(require('./routes/movies'));
module.exports = router;

De esta manera vemos que hemos podido separar nuestras rutas para tener más estructurado nuestro proyecto.

Con esto ya tenemos una base para seguir desarrollando nuestra aplicación desde este punto se puede ir desarrollando diferentes tipos de rutas, implementar diferentes tipos de métodos. La imaginación es el limite.

En una próxima entrada crearemos una API REST mas completa que consuma datos de una base de datos mysql y responda los diferentes tipos de peticiones.

Back to Blog

Related Posts

View All Posts »