Tag browsing: node.js

Express, Sinatra para node.js

August 13th, 2010

Desde su aparición, Sinatra, ha despertado la admiración de mucho, no solo de aquellos que trabajan con Ruby, sino de developers de otros lenguajes que han decidido crear micro frameworks Sinatra like para utilizar en su lenguaje favorito y portar su filosofía a otros ámbitos, en node.js tenemos a Express, el mismo esta madurando rápidamente y esta recibiendo mucho apoyo de la comunidad.

Instalación

Hay varias opciones para instalar Express, la primera opción es instalarlo desde su instalador online corriendo el siguiente comando.

$ curl http://expressjs.com/install.sh | sh
# Si necesitamos permisos adicionales
$ curl http://expressjs.com/install.sh | sudo sh

La segunda opción es usar npm (node package manager), el cual es conveniente instalar ya que muchos módulos y frameworks para node.js lo están usando como medio de distribución.

# Instalando Express y sus dependencias vía npm
$ npm install express

La ultima opción es clonar el repo de github y compilarlo.

$git clone git://github.com/visionmedia/express.git
#Actualizamos los sub modulos
$ git submodule update --init
#Compilamos
$ make install

Hello World

Vamos a comenzar con un ejemplo simple, si ven el código a continuación verán que lo primero que hacemos es cargar el modulo express, creamos un server que por convención son llamados apps, luego crearemos la ruta, la misma puede consistir en un string o en una expresión regular, seguimos con una callback y un metodo HTTP, en el ejemplo usamos un metodo GET que apunta a / y cuyo callback dispara la función que nos devuelve el Hello World.

var express = require('express'),
    app = express.createServer();
    app.get('/', function(req, res){
    res.send('Hello Worldn');
});
app.listen(3000);

Si todo sale bien, deberíamos de ver algo así.

Hello World - Express

Otro ejemplo

Ahora pasemos a un ejemplo un poco mas complejo, en el mismo usaremos un archivo con un array JSON el cual hará de datasource.

[
    { "name": "Minke" },
    { "name": "Lidewij" },
    { "name": "Eva" },
    { "name": "Helen" },
    { "name": "Wieke" },
    { "name": "Fatima" }
]

El código del ejemplo comienza cargando el modulo Express y el modulo fs encargado de acceder al file system, levantamos el server, parseamos el datasource y lo asignamos a una variable, seguimos creando las rutas, el modelo, otra ruta para / la cual mostrara las instrucciones de uso y por ultimo le decimos a nuestra app que se quede escuchando en el port 3000.

var express = require('express'),
	fs = require('fs');

var app = express.createServer();
var players = JSON.parse(fs.readFileSync('players.json', 'utf8'));

app.resource = function(path, obj) {
    this.get(path, obj.index);
    this.get(path + '/:id', obj.show);
};

var Player = {
    index: function(req, res){
        res.send(players);
    },
    show: function(req, res){
        res.send(players[req.params.id] || { error: 'player not found' });
    }
};

app.resource('/players', Player);

app.get('/', function(req, res){
    res.send([
        '<p>GET /players</p>',
        '<p>GET /players/1</p>',
    ].join('n')); 
	res.end();
});

app.listen(3000);

Es hora de correr y probar el ejemplo, primero intentemos obtener todos los registros.

# Muestra la totalidad de los registros
$ curl http://localhost:3000/players/

Ahora probemos traer un registro especifico.

#Devuelve el nombre del registro 3
$ curl http://localhost:3000/players/3

Recursos

Development , , , No response

node.js 101

August 10th, 2010

node.js es el enésimo intento de llevar JavaScript del lado del servidor, pero al parecer esta vez a base de mucho hype y una arquitectura bien diseñada, la idea esta traccionando y haciendo que el numero de seguidores crezca día a día.

Como dije antes esta idea no es nueva, ya desde 1996 Netscape trataba de meter JavaScript en el server side con su producto LiveWire, el tiempo paso y muchos proyectos intentaron en vano captar la atención, luego llego CommonJS, la cual es una especificación que trata de crear un API estándar para el manejo de las funcionas mas comunes y necesarias para poder correr JavaScript fuera del ámbito del browser, CommonJS puso nuevamente en el radar la idea de usar JavaScript en el server side y empezaron a florecer gran cantidad de implementaciones compatibles con ella, una de estas es node.js.

node.js como reza su lema “Evented I/O for V8 JavaScript” se apoya en un arquitectura orientada a eventos y en el motor V8, para lograr una alta escalabilidad y una gran velocidad de ejecución, node.js abandona el modelo tradicional usado por los servidores web en los cuales por cada request se crea un thread/process y pasa a un modelo de event loop en donde se puede acceder a todo usando eventos y callbacks, esta idea tampoco es nueva, en Ruby tenemos a EventMachine y en Python a Twisted haciendo algo parecido desde hace un tiempo y de los cuales node.js a tomado debida nota para tomar lo mejor de ellos, en node.js todas las operaciones de I/O se ejecutan asincronicamente, lo que permite al servidor seguir aceptando requests mientras las operaciones de I/O se completan, lo cual posibilita crear aplicaciones rápidas y escalables muy fácilmente.

node.js corre sobre cualquier OS *nix, su instalación es muy sencilla y tanto en el sitio oficial como en el repositorio de github donde se aloja el proyecto hay información al respecto.

Antes de terminar pasemos al “hello world” de rigor.

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello Worldn');
}).listen(3003);

En la primera linea se carga el modulo http, luego creamos el server http el cual queda a la espera de las requests en el port 3000, cuando una request llega, este responde enviando las http headers, un status code 200 y el mensaje “Hello World”, para luego finalizar la conexión.

node.js - Hello World

Para finalizar les dejo el vídeo de la presentación que dio Ryan Dahl (su creador) hace unos meses en las oficinas de Google, la cual es un buen punto de partida para interiorizarse mas en la arquitectura y filosofía de node.js.

Development , , No response