En esta lección, necesitamos hacer casi exactamente lo mismo que en la lección anterior. Sin embargo, debemos encapsular la solución anterior en una función y asignar la función a la propiedad exports del objeto módulo para que pueda ser llamada desde otro fichero.

Leccion-6 learnyounode Lección 6 - hágalo modular

Para ello, es necesario asignar una función a la propiedad exports del objeto módulo.

module.exports = function() {}

Asignar nuestra función a module.exports nos permitirá asignar nuestra función a una variable en otro programa, de forma muy similar a como asignamos el sistema de ficheros o los módulos de ruta.

var solution = require(‘./mySolution’)

Note que en lugar de asignar el módulo como require(‘fs’), en realidad necesitamos especificar la ruta relativa al módulo. En el ejemplo anterior, estamos diciendo que la ruta relativa es la misma que la de cualquier programa en el que estemos asignando el módulo, prefijando ‘./’ al nombre de nuestro módulo.

La solución alternativa proporcionada para la lección anterior nos da el 90% del camino. Sólo tenemos que hacer unos pocos cambios para que sea modular.

var fs = require(‘fs’)
var path = require(‘path’)
 
var dir = process.argv[2]
var filterStr = process.argv[3]
 
function getFiles(dir, filterStr, callback) {
 
  fs.readdir(dir, function (err, list) {
    if (err)
      return callback(err)
 
    list = list.filter(function (file) {
      return path.extname(file) === ‘.’ + filterStr
    })
 
    callback(null, list)
  })
}
 
getFiles(dir, filterStr, function (err, list) {
  if (err)
    return console.error(‘There was an error:’, err)
 
  list.forEach(function (file) {
    console.log(file)
  })
})

Solución oficial

Si compara la solución oficial de abajo con la solución de la lección anterior, verá que la solución se ha dividido en dos archivos separados. Además, ya no estamos nombrando nuestra función. En su lugar, lo estamos asignando al objeto module.exports.

Puede asignar una función con nombre a las exportaciones. Sin embargo, esta lección pide que se asigne una función sin nombre a module.exports para reemplazar lo que está actualmente asignado al objeto.

Lo podemos llamar solucionFilter.js

var fs = require(‘fs’)
var path = require(‘path’)
 
module.exports = function (dir, filterStr, callback) {
 
  fs.readdir(dir, function (err, list) {
    if (err)
      return callback(err)
 
    list = list.filter(function (file) {
      return path.extname(file) === ‘.’ + filterStr
    })
 
    callback(null, list)
  })
}

No estamos llamando a nuestra función en este programa. En su lugar, lo estamos llamando en un programa separado llamado solution.js. A menudo, el programa utilizado para llamar a los módulos se llama main.js o index.js.

Tenga en cuenta que estamos asignando el sistema de archivos y los módulos de ruta en el mismo programa que declaramos nuestra función. No necesitaremos asignar estos módulos de nuevo en nuestro programa principal para usar nuestra función.

solucion.js

var filterFn = require(‘./solution_filter.js’)
var dir = process.argv[2]
var filterStr = process.argv[3]
 
filterFn(dir, filterStr, function (err, list) {
  if (err)
    return console.error(‘There was an error:’, err)
 
  list.forEach(function (file) {
    console.log(file)
  })
})

In our main program, we are assigning our module to filterFn.  In the official solution the relative path to the module includes the ‘.js’ extension.  However, including the extension is optional.  We are also assigning the third and fourth arguments passed to process.argv from the command line to the variables dir and filterStr.

filterFn() is used to call our module function.  Dir, filterStr, and a callback function are passed as arguments.  The callback receives list as an argument.  Inside of the callback function, we are looping through list with the forEach() method.  We are passing a callback function to the forEach() method.  The callback accepts file as an argument, and logs file to the console with the console.log()method.

Module Contract

Un aspecto importante de esta lección, además de modularizar nuestro código a la manera de node.js, es el concepto de un contrato de módulos. En este caso, nuestro contrato de módulo es exportar una sola función que toma un directorio, una cadena de filtro y una llamada de retorno como argumentos.

La llamada de retorno debe ser llamada una sola vez, con un error o datos. No estamos modificando ninguna variable global, y estamos manejando todos los errores pasándolos a nuestra devolución de llamada para imprimir un mensaje de error si ocurre un error.

Este concepto es importante porque los módulos creados y publicados en npm (gestor de paquetes node.js) deben comportarse como se espera que el módulo produzca los resultados del contrato del módulo. Construir con módulos es de lo que se trata node.js.

Reader Interactions

Deja un comentario

Tu dirección de correo electrónico no será publicada.

About David Moya

Apasionado de la Seguridad Informática, aprendiendo en todo momento y profundizando en el mundo web y en el posicionamiento en buscadores.

Share This