Eventos en nodejs

NodeJS está orientado a eventos por tanto disponer de mecanismos para definir nuestros propios eventos es algo fundamental. Como vamos a ver no tenemos más que importar el módulo events y a partir de ahí ya podremos trabajar con instancias de EventEmitter. Y como disponemos de herencia, podemos agregar la emisión de eventos a nuestras clases.

Un ejemplo sencillo de eventos

Este programa lee datos por consola y puede generar tres eventos

  • Si el usuario escribe algo
  • Si el usuario escribe espacios
  • Si el usuario escribe 666
Cada evento se ha creado de una forma distinta y uno de ellos tiene un parámetro, más que nada como muestra.

/**
* events.js
* Playing with events and eventEmitter in nodejs.
* @author Pello Xabier Altadill
* @greetz for u
*/

events = require('events');
// We'll use this to create our own events
var em = new events.EventEmitter();

// We need this to get stdin
process.stdin.resume();

console.log("write something to create events ");

// EVENT: thebeast, emitted when user writes 666
em.on('thebeast',function () {
					console.log("EVENT: thebeast> The number of the beast appeared.");
				});

// EVENT: datareaded, emitted when user writes on console
// First we define function Another way to define an event:
var myeventfunction = function (param) {
						console.log("EVENT: datareaded> something readed on console: ");
						console.log(param+"");
					};
// ... and now we set the function to the event
em.on('datareaded', myeventfunction);

// EVENT: thebeast, emitted when user writes 666
em.on('nulldata',function () {
					console.log("EVENT: nulldata> nothing was entered.");
				});

/**
* on data event
* fired when data is entered in stdin
* We'll fire events depending on input data
*/
process.stdin.on('data', function (readedData) {
	// We can emit events with parameters
	em.emit('datareaded', readedData);

	readedData = fulltrim(readedData+"");
	process.stdout.write('You wrote: ' + readedData + "\n");

	// In case we find a 666 we 'emit' an event
	if (readedData == 666) {
		em.emit('thebeast');
	}

	// In case of empty string
	if (readedData == '') {
		em.emit('nulldata');
	}
});


// We can add event support with inheritance
// so we can do inside the class: this.emit()
// util.inherits(myobject, EventEmitter);
// myoject.prototype.newfunction = function () { this.emit() };


/**
* Fulltrim oneliner, thnx stackoverflow
* needed to remove trailing newline char,
* whitespaces and such...
*/
function fulltrim (wordToTrim){return wordToTrim.replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'').replace(/\s+/g,' ');};

Esta sería la salida por consola:

linux# node events.js 
write something to create events 
ñañaña
EVENT: datareaded> something readed on console: 
ñañaña

You wrote: ñañaña
666
EVENT: datareaded> something readed on console: 
666

You wrote: 666
EVENT: thebeast> The number of the beast appeared.

EVENT: datareaded> something readed on console: 


You wrote: 
EVENT: nulldata> nothing was entered.

by Pello Altadill 08/13/2013 10:37:21 - 284 hits

Consejos para programar Android

Desarrollar aplicaciones para Android no es tan ágil como con otras tecnologías. Montar la aplicación configurando cada uno de los ficheros XML (cosa que está bien pensada y tal) es un poco pesado y lo peor es que cuando lo quieres probar para ver el resultado tienes que esperar mucho y encima lo más seguro es que casque y que la aplicación se pare de forma inesperada. Voy a dejar aquí algunos consejillos que espero resulten útiles. ...

by Pello Altadill 08/13/2013 09:40:38 - 710 hits

More »

Hibernate self join con XML

El hecho de echar un ojo a SGBD noSQL no significa que lo relacional esté proscrito, por eso hay que seguir investigando más escenarios de hibernate. Existen situaciones en las que una tabla o entidad se hace referencia a sí misma. El ejemplo típico es el de empleado con un campo idjefe que hace referencia a otro empleado. Otro mítico se da en los foros, donde un mensaje puede tener un id de mensaje padre. Siguiendo con nuestro ejemplo del ERP vamos a ver cómo apañar el mapeo a si mismo con la ta...

by Pello Altadill 08/12/2013 14:26:02 - 403 hits

More »

Almacenamiento local en HTML5

Local Storage Los navegadores modernos van disfrutando de nuevas capacidades impulsadas por HTML5. Una de las más llamativas es la posibilidad del almacenamiento local, en el cliente, que viene en dos formas: por un lado en dos arrays relacionales que nos permiten guardar datos con un límite supuesto de 5Mb (al estilo del $_SESSION de php pero en el cliente) y por otra parte la posibilidad de tener una base de datos en el cliente. Está última, que un principio parecía iba a ser SQLite fina...

by Pello Altadill 08/11/2013 22:51:12 - 359 hits

More »

Leyendo por consola y herencia en nodejs

Para poder hacer cosas básicas en la consola con node tenemos un objeto predefinido llamado process que nos provee de todo los necesario, desde jugar con la stdin, stdout, stderr hasta terminar la ejecución. En un alarde de originalidad, aquí tienes una calculadora muy simple en la que se deben introducir dos números y un operador. /** * calc.js * Trying to code the good ol' calc with node event driven way * @author Pello Xabier Altadill Izura * @greetz for you *...

by Pello Altadill 08/11/2013 00:17:05 - 408 hits

More »

Hello nodejs

Hay gente que con la imposición vital esa de que hay que probar de todo va y se mete ketamina. Otros preferimos echar un vistazo a nodejs, en pleno viernes y después de haber visto Guerra Mundial Z. No estaba mal. Bueno, definiciones decentes de nodejs tendrás mejores, pero básicamente, aquel javascript que se supone que había para servidor ahora ya no es una especie de mito, a...

by Pello Altadill 08/10/2013 00:36:14 - 644 hits

More »

CSS3 Button generator

Tengo pendiente crear una sección labs en la página para estas cosas. En fin, seguramente esto que puedes ver a continuación ya existe y tal, pero ya se sabe, el reinventing the wheel es una mala/buena costumbre. Se trata de un simple formulario en el que elegimos algunas propiedades para nuestro botón. El botón en principio no es más que un simple enlace. Al pulsar el botón generate se aplican los estilos css mediante un (horrible y mejorable) script de jquery y conseguimos una ...

by Pello Altadill 08/08/2013 23:23:51 - 263 hits

More »

Colas de mensajes con ActiveMQ

Las MQ o Message Queues son gestores de colas de mensajes que permiten la comunicación ASÍNCRONA entre programas. Antaño (toju, toju, a principios de siglo) era frecuente que en cualquier proyecto monstruoso de esos que montaban las consultoras además de Oracle, Java y Weblogic también hubiera el MQSeries de IBM. ¿Qué tiene de útil la comuinicación asíncrona? En este tipo de comunicaciones el emisor NO se queda esperando a que el receptor reciba el mensaje. El emisor deja el me...

by Pello Altadill 08/06/2013 15:34:17 - 1526 hits

More »

Asomándose a MongoDB

Los gestores de bases de datos relaciones parecían algo eterno e inamovible en al informática por mucho que aparecieran nuevos lenguajes y entornos de programación. Pero las cosas cambian. Ahora las grandes BBDD no son sola las del gobierno y los bancos, ahora hay muchas aplicaciones que presentan un perfil distinto al de las aplicaciones tradicionales: son aplicaciones que también manejan muchos datos pero en los que sobre todo se hace mucha consulta. Y para acelerar al máximo el servicio de esas ...

by Pello Altadill 08/04/2013 21:10:33 - 536 hits

More »