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.

nodejs logo

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, ahora es algo completamente viable. Nodejs es una plataforma de desarrollo de aplicaciones de javascript que podemos usar en un servidor para eso, para dar servicio. Y promete un edén de rendimiento y escalabilidad. Una de sus claves es que está orientado a eventos por lo que tienes que cambiar la forma de diseñar las aplicaciones. En node hay un único hilo de ejecución, pero lo petas de eventos. Seguramente habrás visto que te haces un servidor web con 4 líneas de código: es cierto.

Si ejecutas simplemente node te sale una especie de shell donde puedes meter código javascript, como por ejemplo

root@bt:~/nodejs# node
> console.log("hola");
hola
undefined
> .help
.break	Sometimes you get stuck, this gets you out
.clear	Alias for .break
.exit	Exit the repl
.help	Show repl options
.load	Load JS from a file into the REPL session
.save	Save all evaluated commands in this REPL session to a file
> var i = 600;
undefined
> var j = 66;
undefined
> i = i + j;
666
> 

Ahora mismo nodejs es de esos proyectos muy vivos con muchas aportaciones y desarrolladores creando módulos. al igual que otras tecnologías trae una base y luego se le pueden añadir infinidad de módulos, pero para que no te falte lo esencial aquí tienes la lista de los 15 más solicitados.. Para instalar los módulos prepara la conexión a internet y ejecuta:

linux# npm install express jade

Con eso instalaríamos los módulos express y jade por ejemplo.

Para ejecutar un programa con node lo que hacemos es invocar node pasándole un nombre de fichero javascript:

linux# node helloserver.js 
Listening on port 8666

Dicíendo hola por web

Hay varias formas de hacer esto, muchas veces verás que se usa el módulo http pero en mi caso me ha gustado más el express con el evento get. Es muy simple. Le decimos un puerto, lo ponemos a la escucha y luego vamos metiendo eventos get que respondan a distintas url. El evento tiene dos parámetros request y response, qué míticos. Con response obviamente mandamos la respuesta. Para este ejemplo tenemos que tener el módulo express instalado.

/**
* Hello server using express module
* It will respond to an event when it receives '/hello' request
* To test just run this with
* linux# node helloserver.js
* And see from a browser http://localhost:8666/hello
* @author Pello Xabier Altadill Izura
*/
var express = require('express');
var myserver = express();
var port = 8666;  // By demon be driven

// event when server receives GET /hello request
myserver.get('/hello', function(req, res){
	res.send('Say hello to my little friend');
});

myserver.listen(port);
console.log('Listening on port ' + port);
Acceso a MongoDB

Tenemos varias formas de acceder a BBDD MongoDB, en mi caso voy a meter el módulo mongoose, pero también tenemos mongojs y mongodb. A ver, va a ser una cosa curiosa. Se conecta a una BBDD y la consulta la hará de forma similar al cliente Mongo, pero antes de hacer la consulta hay que decirle de alguna forma cómo es el esquema que va a recibir. En otros lenguajes tú haces la consulta y luego vas haciendo: dame un string, un entero,... con Mongoose se hace al revés. Primero defines lo que esperas y luego ya consultas con find. En este caso es una BBDD de frases y sacamos todos los registros. Tal y como se explica en el programa, sacar un registro aleatorio de MongoDB no es algo directo y hay que hacer marranadas (para mí sí, lo siento) para conseguirlo. Bueno, al rollo:

/**
* Access to mongodb database
* using mongoose module. It's weird but:
* "programmers need to define consistent access patterns in their own programs."
* @author Pello Xabier Altadill Izura
* picking a random record seems to be a tricky issue, and a feature request is pending yet:
* https://jira.mongodb.org/browse/SERVER-533
* Import quotes.json to quotesdb database:
* mongoimport -d quotesdb -c quotes  quotes.json
*/

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/quotesdb');

console.log('Let\'s connect');

var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));

// Here comes the weird thing -for me-.
// to query mongodb you've to define the Schema you expect.
var quotesSchema = new mongoose.Schema({ content: 'string', author: 'string' });
var quotes = mongoose.model('quotes', quotesSchema);

// Once we are connected we can query the database
db.once('open', function callback () {
  console.log('Ok, we are connected');

  // Here we can behave like a mongo client.
  // so we execute a find on every record {}, showing all fields {}
  // and with a callback function to show results.
  quotes.find({},{},function (err, allquotes) {
  	//if (err) // TODO handle err
  	allquotes.forEach(function (q) {
				  	console.log(q.content)
  				});
	});
});
Putting all together

Pues eso, mezclo el server inicial con esta consulta a mongo y ya tengo un servidor web en nodejs que responde a peticiones con consultas a una BBDD. Otra pieza más en el puzzle... pero ojo, mucho javascript pero aquí hay más backend que en un tomcat.

/**
* quote server
* Mixing express and mongoose
* @author Pello Xabier Altadill Izura
*/
// Web server creation
var express = require('express');
var myserver = express();
var port = 8666;  // By demon be driven

// Run the server...
myserver.listen(port);
console.log('Listening on port ' + port);

// Database access
var mongoose = require('mongoose');
// connection
mongoose.connect('mongodb://localhost/quotesdb');

// Must define this once
var quotesSchema = new mongoose.Schema({ content: 'string', author: 'string' });
var quotes = mongoose.model('quotes', quotesSchema);

// event: when the servers receives a GET /quote
myserver.get('/quote', function(req, res){

	// We select the first record....
 	 quotes.findOne(function (err, quote) {
  			// And we serve...
			res.send(quote.content)
		});

});

Por si quieres probar la BBDD, mete esto en un fichero quotes.json y ejecuta: mongoimport -d quotesdb -c quotes quotes.json

{ "_id" : { "$oid" : "52056e0401853f407ce977b0" }, "content" : "I am your father", "author" : "Darth Vader" }
{ "_id" : { "$oid" : "52056e9001853f407ce977b2" }, "content" : "Why so serious?", "author" : "The Joker" }
{ "_id" : { "$oid" : "52056ecc01853f407ce977b3" }, "content" : "I find your lack of faith disturbing", "author" : "Darth Vader" }

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

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 - 196 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 - 1025 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 - 429 hits

More »

Conectar el móvil android en linux

Una de las razones por las que nacio este codeblog era precisamente para apuntar recetas concretas en algún sitio para luego poder consultarlas, como por ejemplo establecer usuarios en mysql, la típica tontería que nunca te aprendes de memoria porque siempre la consultas. Hoy toca darle al android ya que... ...conectar el móvil android a un linux para poder usarlo como herramienta de desarrollo no es simple, o al menos no es plug-and-play. En mi caso se trata de un móvil LG-E430 sobre un Ubuntu ...

by Pello Altadill 08/03/2013 22:04:11 - 616 hits

More »

Maven proyectos multimódulo

Crear un proyecto con Maven es relativamente fácil, una vez que lo inicias, te ajustas a su manera de organizar los directorios y todo son ventajas. Otra cosa útil es que podemos crear proyectos independientes que luego podemos unir/reutilizar en proyectos más complejos. Lo que vamos a hacer en este ejemplo es crear tres proyectos, y uno de ellos, el main o principal, hará uso de los otros dos. No tiene que ver con proyectos padre-hijo y herencia, aquí se trata de proyectos totalmente independientes...

by Pello Altadill 08/02/2013 15:59:19 - 580 hits

More »

REST in Spring

Sí, llevamos un tiempo que se habla de REST y no es de extrañar ya que puede jugar un papel fundamental en la tendencia actual de restarle protagonismo al servidor y dárselo al cliente. Efectivamente, ahora lo que mola, lo trendy es que el navegador se encargue de la aplicación y el servidor de guardar los datos, todo ello poniendo al navegador ciego de frameworks javascript MVC/P. Es curioso que hasta hace no mucho, aún se veían aplicaciones web que se jactaban de minimizar el uso de javascript t...

by Pello Altadill 08/01/2013 21:19:47 - 390 hits

More »

Seguridad en Spring

¿Necesitas aplicar alguna medida de seguridad en Spring? Sin problema. ¿Cansado de implementar una y otra vez un mecanismo de login/logout en una aplicación web? Spring te lo da hecho. ¿Cómo quieres la validación? Un ficherillo XML, una base de datos, un ldap, ... tienes varios sabores. Sí, incluso OAuth, en modo backend y con canas ;). Aparte de la validación Spring también te facilita enormemente el ACL a distintas partes de la aplicación, permitiendo aplicar reglas según determina...

by Pello Altadill 07/30/2013 21:58:30 - 424 hits

More »

Probando HSQLDB

HSQLDB es un gestor de bases de datos escrito íntegramente en java, con soporte a la última para SQL, bla bla y afirman ser los líderes en su terreno, los más guapos, los más rápidos,... aunque no dicen nada de H2 por si acaso. Tiene tres modos de funcionamiento: Memoria: todas las tablas se guardan en la memoria RAM. Acceso local claro está. Fichero: los datos se almacenan en ficheros. Acceso local obviamente. ...

by Pello Altadill 07/29/2013 00:51:57 - 576 hits

More »