En este post hablaremos brevemente de arquitectura de diseño y empezaremos con el framework web express a partir del cual haremos todo el trabajo con Node como será el crear una API.

MVC

En el mundo de la programación existen varios patrones de arquitectura de desarrollo de software (tengo pendiente una línea de post donde hablaremos de varios de ellos), uno de los más usados es el Modelo-Vista-Controlador (MVC), y por el momento es como iremos viendo lo que hacemos en Node, aunque puede que no lo sigamos al pie de la letra pero voy a explicar un poco los conceptos para que podáis decidir como estructurar vuestra aplicación, lo primero vamos a ver es que sería cada elemento

Chart MVC

  • Vista: la vista en una API con Node podría ser el JSON que devolvemos con los datos. O si no como su nombre indica sería el que gestiona la vista. Recibe las acciones del usuario y actúa en consecuencia comunicandose con el controlador.
  • Controlador: Son los que deciden el qué, es decir son los que estan en medio de la vista y el modelo, y deciden qué es lo que mostrará (o enviará) la vista o deciden que es lo qué guardamos en el modelo.
  • Modelo: Los modelos son los que gestionan la información, es decir, son los que guardan o recuperan la información desde o para los controladores según las necesidades de la vista.

Nunca debe haber comunicación entre Vista y Modelo

Express

Express es el framework web básico (muchos extienden de él) para Node y lo más fácil es darle al código para verlo, comentar que se usa más normalmente para crear APIs, que para hacer webs.
Primero nos vamos a crear una carpeta llamada express_example, situamos el foco de nuestra línea de comandos dentro y ejecutamos npm init para crear nuestro fichero package.json como hemos visto en post anteriores, de momento dejamos todo por defecto (si queréis cambiar el nombre o ponerle alguna descripción eso da igual).
A continuación usamos npm para instalar las dependencias necesarias de express

npm install express --save

Una vez ya tenemos los módulos necesarios instalados, lo siguiente sera crearnos un fichero js para empezar, lo ideal será que se llame igual que lo que hayamos puesto en el package.json, en mi caso lo he dejado por defecto por lo que lo llamare index.js. Este fichero será desde el cual se iniciará la aplicación.

Dentro de este fichero lo primero de todo será importar (requerir) express y ejecutarlo directamente para tener una instancia de express en nuestra app

'use strict';

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

yo he puesto que se ejecute directamente el método que nos devuelve el require, eso sería lo mismo que

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

Bien a continuación yo os recomiendo que hagáis un console.log de app para haceros una idea de lo que contiene, esta práctica yo la recomiendo y la hago habitualmente para tener una mejor idea de con que elementos estoy tratando y que posibilidades tiene.

'use strict';

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

console.log(app);

Si ejecutamos node index.js veremos que tenemos una instancia con un montón de métodos y propiedades
App instance example
Recomiendo que le echéis un vistazo aunque sea por encima ya que siempre podéis encontrar algún método que no sabéis y que os pueda ser útil en algún momento.

Una vez visto lo que contiene vamos a crear nuestro primer método de API, en este caso será una respuesta a una petición http de tipo get, para el que no sepa de lo que estoy hablando buscar en internet Métodos HTTP y os contarán todo lo necesario sobre el tema, solo por resumir un poco toda comunicación por protocolos parecidos al http tienen una especie de verbo, método o como queráis llamarlo, que indica que tipo de petición están ejecutando, es decir, si la intención de la petición de la petición es obtener datos (seria un get) o por ejemplo los están enviando (post). En este caso vamos a crear una servicio que responda de momento a peticiones get.
Lo primero lo suyo sería mirar la documentación para ver de que estamos hablando, o más bien como lo hacemos y que parámetros necesita por lo que pulsar en Express HTTP method get y mirar un poco de lo que estamos hablando, básicamente necesita el path por el que que escuchará y un callback con lo que hará si coincide la llamada con el método y el path. Para aclarar un poco el path sería todo lo que esta después de una url raiz, es decir, la url raiz de este blog es https://jlgarcia.fulldev.ninja y lo que este a continuación sería lo que estará escuchando nuestro método, si ponemos / estará escuchando en la url raiz que ya hemos comentado. Al lio entonces.

'use strict';

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

app.get('/', function(request, response){
    
});

Para que quede más claro he puesto nombres muy específicos en sus parámetros

  • request: que será toda la información de la petición que recibe.
  • response: Como su nombre indica será la respuesta que devolverá nuestra API.
    Vamos a generar una respuesta simple para probar, lo primero hacemos un console.log con lo que contiene la petición que hemos recibido, y segundo vamos a devolver un simple string, para ello ponemos lo siguiente
app.get('/', function(request, response){
    console.log('He recibido una petición, esta en concreto',request);

    response.send('Me ha llegado tu NinjaPetición');
});

Ya tenemos nuestro método que responde a las llamadas de tipo get en la url raiz mostrandonos la información de la petición recibida y devoldiendo algo, pero esto por si solo no hace nada tenemos que indicarle a Node que se quede a la escucha en algún puerto, para hacer esto usaremos el método listen de nuestra instancia de express, al igual que antes os insto a mirar en la documentación oficial de express. Una vez visto lo que podemos hacer escribimos

app.listen(2000, function(){
    console.log('superapi iniciada en puerto 2000');
});

Esto nos iniciaría un proceso que esta escuchando en el puerto 2000, a la espera de recibir alguna petición get (tal cual hemos puesto arriba) y cuando arranca el proceso nos avisa con un log. Tenemos que tener siempre en cuenta que, como pone en la documentación, app.listen es igual que http.server.listen(). Esto es importante porque en la actualidad no se suele escuchar en http si no en https por lo que realmente el método en un servicio en producción sería https.server.listen(), pero esto ya lo veremos más adelante. Por ahora nuestro fichero index.js quedaría de esta manera

'use strict';

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

app.get('/', function(request, response){
    console.log('He recibido una peticion, esta en concreto',request);

    response.send('Me ha llegado tu NinjaPetición');
});

app.listen(2000, function(){
    console.log('superapi iniciada en puerto 2000');
});

Ahora vamos a ejecutarlo con node index.js y si todo va bien deberíamos ver en la consola
API Listen port 2000

Ya tenemos nuestra API en pie, para probarla escribimos en el navegador localhost:2000, no os preocupéis por el tipo de petición, por defecto el navegador siempre usa el método get. Si todo va bien deberiamos ver en el navegador algo similar a esto
Node API response
Y en nuestra consola nos aparecezan un montón de lineas con toda la información que tiene la petición que ha recibido nuestra API desde el navegador
Request example
Como veis es un montón de información, por ejemplo en algun punto estan los headers donde podemos encontar el tipo de navegador
header example
muy útil si queremos diferenciar lo que responde nuestra API segun el navegador, o el idioma
language request example
si por ejemplo tenemos el contenido en varios idiomas distintos.
Lo que quiero decir es que si miráis un poco veréis un montón de información que puede ser muy útil según para que, y esta es usable como cualquier otro parámetro, por ejemplo vamos a confirmar el método que hemos recibido, para ello cambiamos nuestro console.log a

console.log('He recibido una peticion, esta en concreto',request.method);

que al llamar de nuevo a localhost:2000, nos mostrará
Request method example

Como extra, vamos a usar un módulo para que en nuestra consola aparezca información útil directamente por cada petición que recibe nuestra API (esto realmente suele usarse como un log y se almacena en un fichero para que se pueda revisar), este módulo se llama morgan (hay muchos otros). Para usarlo hacemos lo de siempre, npm install morgan --save y para usarlo por el momento quitamos el console.log y sería suficiente con importar/requerir el paquete y usarlo, ponemos debajo de nuestro anterior require

var morgan = require('morgan');

app.use(morgan('dev'));

Ejecutamos con node index.js y al llamar de nuevo a localhost:2000 en nuestro navegador nuestra consola nos mostrará
Morgan log example
Vemos que en los datos que nos muestra aparece el método con el nos han llamado, el path, el código del estado HTTP y el tiempo de la respuesta. En el caso de que tuvieramos algún error nos aparecería el código http pertinente lo que puede ser muy útil para depurar algún tipo de error.

En este post hemos visto el uso básico de express con node, creando una API muy simplona, además hemos visto que es exactamente el MVC y por último como ver información útil de las peticiones que recibe nuestra API creo que para un post ya es suficiente jejejeje. En el próximo seguiremos viendo cosas de express y muchas cosas más.

Un abrazooorrrrr