Introducción a Express (parte 3)

Introducción a Express (parte 3)


En este post trataré de ser breve y tratar de finalizar el asunto de los routes ya que sino vamos a pasar de una introducción de Express a un libro del mismo. Ya hemos visto como configurar rutas, pero ¿existe alguna opcion de que estas rutas se registren automaticamente desde nuestros ficheros en routes? ¿Existe algun modo de cargarlos de forma dinámica?.

Creo que la primera duda que a mi me vino a la cabeza fue, ¿comó puedo cargar cada uno de los ficheros de route?. Aqui entra "fs" que nos permite leer ficheros:

fs.readdirSync(\"directory/path\").forEach(function(file){  
    // file treatment
});

Como podemos ver fs dispone de un API bastante sencilla para leer los ficheros de un directorio y en este ejemplo me he decantado por usar readdirSync (como siempre disponemos de las dos versiones a/sincrona) para realizar la lectura de forma secuencial.

readdirSync retorna la lista de ficheros y si a esto le sumamos la función require tenemos:

// route load and initialization
fs.readdirSync(\"routes\").forEach(function(file){  
    var route = require(\"./routes/\"+file);
});

Ya tenemos cargado cada uno de los ficheros en routes, pero esto no es suficiente ya que debemos cargar cada una de las funciones. Para lograrlo, disponemos de exports (o module.exports) que hace accesible las funciones que han sido cargadas con require, por lo que en nuestros ficheros routes podemos hacer algo como:

exports.get = {};  
exports.post = {};  
exports.all = {};

exports.get[\"/myroute\"] = function (request, response, next){  
    // rendering my template
    response.render(\"myroute\", {});
};

Hemos creado tres elementos en exports para almacenar cada uno de los tipos de peticiones GET, POST, ALL y hemos agregado los contextos asociados (ej: "myroute") haciendo accessible todo lo que contienen. Solo queda mejorar nuestra carga con readdirSync para que cargue cada una de nuestras funciones:

// route load and initialization
fs.readdirSync(\"routes\").forEach(function(file){  
    var route = require(\"./routes/\"+file);
    for(var method in route){
        for(var path in route[method]){
            app[method](path,route[method][path]);
        }
    }
});

Como podemos observar el primer bucle obtendrá todos los elementos en exports que en nuestro caso eran los métodos HTTP GET, POST, ALL y el segundo bucle obtiene cada uno de los elementos en cada uno de los exports anteriores. Y finalmente para cargar cada uno de los contextos:

// normal way 
app.get(\"/myroute\", function(request, response, next){  
    response.render(\"myroute\", {});
});

// dynamic way
// method = GET
// path = \"/\"
// route[method][path] = function(request, response, next){
//     response.render(\"myroute\", {});
// }
app[method](path,route[method][path]);