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: [http://localhost:3000](http://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 [http://localhost:3000](http://localhost:3000) pero si en la ruta del controlador de usuarios [http://localhost:3000/users](http://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 - [Código del proyecto](https://github.com/dcs-community/nodejs-express-api) - [Documentación de chai](https://www.chaijs.com/) - [express-generator](https://expressjs.com/es/starter/generator.html) # 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