Binary Coffee

Crear un proyecto en Nodejs con Express

expressjs javascript nodejs

Como pequeño dato antes de empezar, decir que este será el primero de una serie de artículos enfocados a crear una api base en Nodejs con express que permita empezar un proyecto de manera muy fácil y rápida.

Sumario

  • Crear el proyecto
  • Configurar las pruebas
  • Configurar nodemon en el proyecto

Crear el proyecto

Para crear el proyecto, usaremos las herramientas que los desarrolladores de express han creado, donde se define ya una estructura de cómo y en qué manera, debemos organizar la lógica de la aplicación.

Primeramente se necesita instalar la herramienta express-generator de manera global y así poder generar el proyecto. Con el siguiente comando se instala la herramienta:

$ npm install express-generator -g

NOTA: si utilizan Webstorm como es mi caso, al utilizar el generador de nodejs express application, este hace exactamente lo mismo que haremos en el siguiente paso, puesto que también utiliza express-generator

Un vez instalada la herramienta, pasamos a generar le proyecto con el siguiente comando:

$ express nodejs-express-api

Si todo fue bien con el paso anterior, se debe haber generado el proyecto con los siguientes archivos:

┬ nodejs-express-api (carpeta de la aplicación)
├┬ public (Archivos compartidos por la api)
│├─ javascripts 
│├─ images
│├┬ stylesheets
││└─ style.css
│└─ index.html (Página inicial por defecto)
├┬ routes (Carpeta en que se encuentran lo que serían nuestros controladores)
│├─ index.js
│└─ users.js (Controlador de ejemplo para obtener el listado de usuarios)
├┬ bin
│└─ www (Script para ejecutar la aplicación)
├─ app.js (Script donde se define la lógica inicial para iniciar la aplicación)
└─ package.json

Teniendo todos estos archivos, solo nos queda ejecutarlo y probarlo

$ npm install
$ npm start

Y podemos verlo en el navegador: localhost:3000

Pero como nuestro objetivo es crear una api, vamos a eliminar todo lo que se encuentra en la carpeta public y solo dejamos dentro un archivo .gitkeep (esto es solo para que la carpeta se mantenga en el control de versiones, porque git no lleva el control de versiones de los directorios, solo de los archivos)

Y por otra parte debemos eliminar la línea en que se enlazaba la ruta / al index.html en el archivo app.js

...
(-) var indexRouter = require('./routes/index');
...
(-) app.use('/', indexRouter);
...

Hecho esto, y ejecutando nuevamente el proyecto, no obtendremos nada en la ruta localhost:3000 pero si en la ruta del controlador de usuarios localhost:3000/users.

Es así como de una manera bien sencilla se puede crear un proyecto nuevo en Nodejs con Express.

Configurar las pruebas

Para hacer pruebas a un proyecto de Nodejs existen infinidad de herramientas que se pueden usar, pero en este artículo utilizaremos mocha para las pruebas y chai para el uso de las disímiles funciones que brinda en integración con mocha.

Lo primero que se necesita, es instalar las herramientas necesarios, a continuación todas ellas listadas:

$ npm install --save-dev mocha chai chai-http

Luego de esto, el package.json debe quedar de la siguiente manera:

{
  "name": "nodejs-express-api",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www",
    "test": "mocha --ui bdd ./test --recursive"
  },
  "dependencies": {
    "cookie-parser": "~1.4.4",
    "debug": "~2.6.9",
    "express": "~4.16.1",
    "morgan": "~1.9.1"
  },
  "devDependencies": {
    "chai": "^4.2.0",
    "chai-http": "^4.3.0",
    "mocha": "^7.1.1"
  }
}

Tener en cuenta que se agregó el script test para correr los test. Luego de este paso lo siguiente es crear la primera prueba. Para ello crearemos un directorio llamado test y dentro del mismo otro directorio llamado integration.

┬ nodejs-express-api
│...
├┬ test (Aquí se pondrán las pruebas del proyecto)
│├┬ integration (Para las pruebas de integración)
││└─ users.js (Pruebas al controlador users)
│...

Dentro de este directorio integration, vamos a crear el archivo users.js (el mismo nombre que tiene el controlador) y copiamos el siguiente código:

// test/integration/users.js
const chai = require('chai');
const chaiHttp = require('chai-http');

const app = require('../../app');

chai.use(chaiHttp);

const expect = chai.expect;

describe('Users controller', () => {
    it('should get the list of users', (done) => {
        chai.request(app)
            .get('/users')
            .end((err, res) => {
                expect(res.body).to.be.an('array');
                done();
            });
    });
});

Y a continuación ejecutemos los test y veamos que ocurre. Pues sí, han fallado los test, porque el controlador no retorna un arreglo como esperamos en la prueba. Para hacer que la prueba pase, tenemos que ir y arreglar el comportamiento del controlador. Para ello vamos al controlador y retornemos un arreglo vacío.

// routes/users.js
var express = require('express');
var router = express.Router();

/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send([]);
});

module.exports = router;

Ahora volvamos a correr los test y pum, tenemos nuestro primer test de integración corriendo. Lo que antes hicimos y para quien no esté familiarizado con el tema, es TDD. TDD significa Test Development Driven, o lo que sería en Español, Desarrollo guiado por pruebas. Dado que creamos primero la prueba con el comportamiento esperado para el endpoint y luego esta prueba nos guió en la implementación de la lógica del controlador.

Y así de fácil tenemos la primera prueba de integración en nuestro cascarón.

Configurar nodemon en el proyecto

A continuación veremos como la herramienta nodemon, puede ser muy útil a la hora de desarrollar en nuestra api.

Con la herramienta nodemon, lo que lograremos será: una vigilancia constante sobre los archivos del proyecto y de esta manera si actualizamos algo en el código automáticamente se reiniciará la api. Esto es algo parecido a lo que tenemos con Angular mientras desarrollamos y se reinicia el frontend automáticamente luego de un cambio.

Lo primero que tenemos que hacer es instalar la dependencia

$ npm install --save-dev nodemon

Hecho esto, agregamos un nuevo script al package.json como en el siguiente ejemplo:

{
  ...
  "scripts": {
    "start": "node ./bin/www",
    "start:dev": "nodemon ./bin/www", // este es el nuevo script
    "test": "mocha --ui bdd ./test --recursive"
  },
  ...
  "devDependencies": {
    ...
    "nodemon": "^2.0.2"
  }
}

Y a partir de ahora, cuando estemos desarrollando en vez de utilizar el comando npm start utilizamos el comando npm run start:dev y todo cambio que se realice al código, automáticamente reiniciará la aplicación.

Enlaces

Conclusiones

Bueno, esto es todo para este artículo que inicialmente quería que fuera bien corto y se me fue un poquillo de las manos, pero aun así espero que sea de tu agrado y aprendieras algo nuevo.

Próximamente seguiré esta serie de artículos sobre un cascarón de Nodejs con express y le agregaremos otras cosas básicas que no deberían faltar en un proyecto, como son la integración a una base de datos, refactorizar el código, agregar herramientas de estilos como jslint y prettier, migrar de es5 a es6 y muchas otras cosas que no pueden ni deben faltar en un proyecto de Nodejs actualmente.

Hasta la próxima y como siempre digo

Happy coding!

Opiniones