Publicado el 22 de Julio del 2018
1.941 visualizaciones desde el 22 de Julio del 2018
2,2 MB
54 paginas
Módulos node.js
Juan Quemada, DIT - UPM
1
© Módulos node.js
node.js incluye un sistema de módulos que facilita el diseño de grandes programas
n Cada modulo es un fichero diferente con un espacio de nombres local
w Un módulo es una closure creada por node, ver http://nodejs.org/api/modules.html
Un módulo se importa en otro módulo con la función
n require(<fichero>) (ver los detalles en: http://nodejs.org/api/modules.html)
Un módulo tiene una parte pública (interfaz) y otra privada (implementación)
n Interfaz: parte visible en el exterior que permite utilizar el módulo a otros
w La interfaz del módulo se define individualmente los métodos exportados o el objeto interfaz
w Los métodos se exportan individualmente con: exports.metodo_individual = <metodo>
w El objeto interfaz completo se exporta con: module.exports =<objeto_interfaz>
n Implementación: código del módulo que crea la funcionalidad
w El bloque de instrucciones del módulo (cierre o closure)
2
© Juan Quemada, DIT, UPMEjemplo de módulos de node.js
El ejemplo siguiente es un programa con dos módulos, cada uno en un fichero diferente
n Módulo 1: fichero mi_app.js
w importa el otro módulo (en fichero mi_app.js) con: var circulo = require(‘./circulo.js');
w ambos ficheros están en el mismo directorio, hay que utilizar el path ‘./circulo.js'
n Módulo 2: fichero circulo.js
w Exporta los dos métodos de la interfaz, area y circunferencia, con exports.<método> = …..
// Modulo 1: fichero ejecutable mi_app.js, que importa circulo.js
var circulo = require('./circulo.js'); // al estar en el mismo directorio, el path es ./circulo.js
console.log( 'Area (radio 4): ' + circulo.area(4)); // => Area (radio 4): 50.26548245743669
// Modulo 2: fichero con librería circulo.js
// -> exporta las propiedades y métodos de la variable global exports
var PI = Math.PI; // variable privada del módulo, no es visible en el exterior del módulo
exports.area = function (r) { return PI * r * r; }; // método de la interfaz
exports.circunferencia = function (r) { return 2 * PI * r; }; // método de la interfaz
3
© Juan Quemada, DIT, UPMAgenda como modulo
node.js encapsulando
un cierre
4
© Juan Quemada, DIT, UPMAgenda como modulo
node.js encapsulando
una clase
5
© Juan Quemada, DIT, UPMRegExp I: Búsqueda de patrones
6
© Expresiones regulares: RegExp
◆Expresiones regulares:
4Mecanismo muy eficaz para procesar strings
• Soportado por muchos lenguajes y herramientas (UNIX)
»Emacs, vi, AWK, GREP, PERL, Java, Javascript, Ruby, ...
4Definen patrones que reconocen cadenas de caracteres específicas
• Si un patrón reconoce una cadena, se dice que casa (match) con el patrón
◆En JS se definen en la clase RegExp y se pueden crear con
4Constructor: RegExp(“expresion-regular”)
• El string puede ser cualquier expresión regular
4RegExp literal: /expresion-regular/
4Info: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
7
© Búsqueda de patrones
◆"string".match(/patrón/) busca /patrón/ en "string"
4Devuelve primera ocurrencia del patrón en un array ([match]), y si no casa devuelve null
◆Algunos patrones básicos
4caracter: /a/ reconoce solo el caracter “a”
4sequencia: /abc/ reconoce la secuencia “abc”
4principio de string: /^hoy/ reconoce “hoy” al principio del string
4final de string: /hoy$/ reconoce “hoy” al final del string
4cualquier caracter: /./ reconoce cualquier caracter
"Es hoy".match(/hoy/) => ['hoy']
"Es hoy”.match(/hoy/)[0] => 'hoy'
"Es hoy".match(/hoy$/) => ['hoy']
"Es hoy".match(/^hoy/) => null
"Es hoy”.match(/^…./) => [‘Es h']
8
© Clases y rangos de caracteres
◆ Clase de caracteres: patrón con varios caracteres alternativos entre corchetes
4Ejemplo de clase de caracteres: /[aeiou]/ cualquier vocal (minúscula)
4Ejemplo de clase negada: /[^aeiou]/ no debe ser vocal (minúsc.)
4Patrón \s: reconoce separadores [\f\n\r\t\v\u00a0\u1680 ..…. ]
◆ Rango de caracteres: Patrón con un rango de caracteres de ASCII alternativos
4Rango de caracteres: /[a-z]/ rango “a-z” de letras ASCII
4Patrón \w: equivale a [a-zA-Z0-9_]
4Patrón \d: equivale a [0-9]
"canciones".match(/[aeiou]/) => [‘a']
"canciones".match(/c[aeiou]/) => ['ca']
"canciones".match(/n[aeiou]/) => ['ne']
9
© Controles y match()
match() admite controles: i , g y m
n i: insensible a mayúsculas
n g: devuelve array con todos los “match”
n m: multilínea, ^ y $ representan principio y fín de línea
"canciones".match(/[aeiou]/g) => ['a', 'i', 'o', 'e']
"canciones".match(/c[aeiou]/g) => ['ca', 'ci']
"Hoy dice hola".match(/ho/i) => ['Ho']
"Hoy dice hola".match(/ho/ig) => ['Ho', 'ho']
"Hola Pepe\nHoy vás".match(/^Ho/g) => ['Ho']
"Hola Pepe\nHoy vás".match(/^ho/gim) => ['Ho', 'Ho']
10
© RegExp II: Repetición y alternativa
11
© Operadores de Repetición
◆+ (una o más veces): /a+/ casa con: “a”,“aa”, “aaa”, ..
◆? (cero o una vez): /a?/ casa solo con: “” y “a”
◆* (cero o más veces): /a*/ casa con: “”, “a”, “aa”, “aaa”, ...
◆{n} (n veces): /a{2}/ casa solo con: “aa”
◆{n,} (n o más veces): /a{2,}/ casa con: “aa”, “aaa”, “aaaa”, ...
◆{n,m} (entre n y m veces): /a{2,3}/ casa solo con: “aa” y “aaa”
"tiene".match(/[aeiou]+/g) => ['ie', 'e'] // cadenas no vacías de vocales
"tiene".match(/[aeiou]?/g) => ['', ‘i', 'e', '', 'e', ''] // vocal o nada
"tiene”.match(/[aeiou]*/g) => ['','ie', '', 'e', ''] // cadenas de vocales (incluyendo “")
"Había un niño.”.match(/[a-zñáéíóú]+/ig) => [ 'Había', 'un', 'niño' ]
// casa con palabras en castellano: ascii extendido con ñ, á, é, í, ó, ú
12
© Repetición ansiosa o perezosa
◆Los operadores de repetición son “ansiosos” y reconocen
4la cadena más larga posible que casa con el patrón
◆Pueden volverse “perezosos” añadiendo “?” detrás
4Entonces reconocen la cadena más corta posible
"aaabb".match(/a+/) => ['aaa']
"aaabb".match(/a+?/) => ['a']
"ccaaccbccaa".match(/.+cc/) => ['ccaaccbcc']
"ccaaccbccaa".match(/.+?cc/) => ['ccaacc']
13
© Patrones alternativos
◆“|” define dos patrones alternativos, por ejemplo
4/[a-z]+/ casa con palabras escritas con caracteres ASCII
4/[0-9]+/ casa con números decimales
4/[a-z]+|[0-9]+/ casa con palabras o números
"canciones".match(/ci|ca/) => [ ‘ca’ ]
"canciones".match(/ci|ca/g) => [ ‘ca','ci' ]
“1 + 2 --> tres”.match(/[a-z]+|[0-9]+/g) => ['1', '2', 'tres']
14
© RegExp III:
Subpatrones y sustituciones
15
© Subpatrones
◆ Dentro de un patrón podemos delimitar subpatrones
4Un subpatrón es una parte del patrón delimitada entre paréntesis
◆Por ejemplo /(c)([aeiou])/ tiene dos subpatrones
4(c) es el primer subpatrón
4([aeiou]) es el segundo subpatrón y así sucesivamente
◆ "string".match(/patrón/) busca patrón y subpatrones en el string
4Devuelve array: [match, match_subpatron_1, match_subpatron_2, …]
“canciones”.match(/(c)([aeiou])/) => [‘ca’,'c', ‘a']
“canciones”.match(/c([aeiou])n/) => ['can', ‘a’]
“canciones”.match(/(..)..(..)/) => ['cancio', 'ca', 'io']
16
© Sustitución de patrones
◆ La clase String tiene el método replace() para sustituir patrones
◆ La expresión: "string".replace(/patrón/, x)
4devuelve "string" sustituyendo el primer match de "patrón" por x
◆ El patrón también puede tener controles i, g y m
4i: insensible a mayúsculas
4g: devuelve string con todos los “match” sustituidos
4m: multilínea, ^ y $ representan principio y fín de línea
"Número: 142719".replace(/1/, 'x') => 'Número: x42719’
"Número: 142719".replace(/1/g, 'x') => 'Número: x427x9’
"Número: 142719”.replace(/[0-9]+/, '<número>') => 'Número: <número>'
17
© Sustitución con subpatrones
◆ Dentro de un patrón podemos delimitar subpatrones
4Un subpatrón se delimita con paréntesis
◆ Por ejemplo /([ae]+)([iou]*)/ tiene dos subpatrones
4$1 representa el match del primer subpatrón
4$2 el match del segundo y así sucesivamente
4$3 …..
"Número: 142,719".replace(/([0-9]+)(,[0-9]*)?/, '$1') => 'Número: 142'
"Número: 142,719".replace(/([0-9]+)(,[0-9]*)?/, '0$2') => 'Número: 0,719’
"Número: 142,719".replace(/([0-9]+),([0-9]*)?/, '$1.$2') => 'Número: 142.719’
18
© Eventos node.js
19
© Eventos y Manejadores
JavaScript utiliza eventos para interaccionar con el entorno
n Hay muchos tipos: Temporizadores, métodos HTTP, datos, ...
Un evento se programa al instalar un manejador (callback)
n El manejador es una función que se ejecuta al ocurrir el evento
El script inicial programa los eventos iniciales
n Estos se ejecutan al ocurrir los eventos programados
w Estos pueden programar nuevos eventos, si fuesen necesarios
Eje de
tiempos
Programa
principal
evento a
evento b
manejador a
manejador b
20
© Juan Quemada, DIT, UPMEventos periódicos con setInterval(....)
JavaScript tiene una función setInterval (..)
n para programar eventos periódicos
setInterval (manejador, periodo_en_milisegundos)
n tiene 2 parámetros
w manejador: función que se ejecuta al ocurrir el evento
w periodo_en_milisegundos: tiempo entre eventos periódicos
1 seg
2 seg
3 seg
4 seg
5 seg
Eje de
tiempos
setInterval(
manejador,
1000_miliseg.
)
manejador
manejador
manejador
manejador
manejador
21
© Juan Quemada, DIT, UPMEjemplo con temporizador II
+
Comentarios de: Módulos node.js (0)
No hay comentarios