Code School Free Weekend 2016 – Node.js

El de Node.js es el segundo curso de los que voy a tragarme en el Code School Free Weekend.

Antes de empezar

Con node.js sí que he trabajado bastante, tanto directamente escribiendo scripts como indirectamente, con herramientas como Cordova o Ionic, que llevan node por detrás. El problema es que como nunca me he tomado  el tiempo de realizar un curso completo, mucho de lo que hago con node es javascript “vanilla” y las funciones específicas de node las uso lo justo. Vamos a ponerle remedio.

Apuntes

Node está diseñado de tal manera aunque un proceso vaya a tardar, la ejecución no se bloquea. A cada función asíncrona se le puede pasar un calback para indicarle lo que tiene que hacer cuando se produzca un evento. Esos eventos quedan registrados en el ciclo de eventos (event loop) y cuando ocurren, se añaden a cola de eventos (event queue) para que se ejecuten.

Eventos

Muchos objetos emiten eventos predefinidos, pero nos podemos hacer un emisor de eventos a medida:

var EventEmitter = require(‘events’).EventEmitter;
var logger = new EventEmitter();
logger.on(‘error’, function(msg){console.log(‘ERR: ‘ + msg);});
logger.emit(‘error’,’Se ha producido un error’);

Streams y pipes

Muchos módulos leen y escriben los datos como streams, secuencias de chunks .o trozos. Por ejemplo esto permite actuar sobre los datos d eun fichero según se van leyendo, sin tener que esperar a tener todo el fichero en memoria. En un servidor, tanto request como response, son streams. Los pipes conectan streams, enviando el flujo de datos de un stream de lectura a una de escritura.

var.fs = require(‘fs’);
var file = fs.createReadStream(“readme.md”);var newFile = fs.createWrireStream(“readme_copy.md”);
file.pipe(newFile);

Express.js

En este capítulo sólo da una nociones muy simples (que ya sé) sobre express. Coimo voy a hacer el curso de express, este capítulo voy a pasarlo un poco por alto.

Socket.io

Otro capítulo un poco decepcionante, dar una explicación muy simple sobre sockets y montan una aplicación de ejemplo scon socke.io que está sacada tal cual del manual. Me lo apunto para profundizar más.

[server.js]

var express = require(‘express’);
var app = express();
var server = require(‘http’).createServer(app);
var io = require(‘socker.io’)(server);
io.on(‘connection’,function(client){
console.log(‘Connected!’);
client.on(‘message’,function(data){
client.broadcast.emit(‘message’,data);
});
});
server.listen(8080);

[index.html]

<script src=”/socket.io/socket.io.js”></script> <!– lo sirve express –>
<script>
var socket = io.connect(‘http://localhost:8080’);
server.on(‘message’,function(msg){
alert(msg);
});
</script>

Persisting Data

Como ejemplo de cómo se puenden almacenar los datos, esta función guarda mensajes en un objeto de tipo array de una base de datos Redis y va recortándolo para que sólo mantenga los diez últimos.

var redisClient = redis.createClient();
var storeMessage = function(name,data){
var message = JSON.stringify({name: name, dtata: data});
redisClient.lpush(‘messages’, message, function(err, response)){
redisClient.ltrim(‘messages’, 0, 9);
}
}

para devolver los mensajes:

redisClient.lrange(“messages”, 0 , -1, function(err, messages)){ // lee todo el array
messages = messages.reverse();
mesages.forEach(function(message){
messaje = JSON.parse(message);
client.emit(“messages”, message.name + “: “+ message.data),
});
});

Conclusiones

Este curso me decepcionado un poco (comparado con otros de Code School), aunque me doy por satisfecho. He acladado algunos conceptos básicos sobre node, y en genral me siento más cómodo con la plataforma. Ahora, a trabajar, trabajar, trabajar.