Node js 101 a MVC

Daniel Zavala(@siedrix)

Codigo disponible en https://github.com/Siedrix/presentaciones/tree/master/node101toMVC

presentación disponible en http://siedrix.com/presentaciones/node101toMVC/

Que no es node?

Un framework

Una libreria

Una maquina virtual

¿Qué es Node.js?

Es un event server que corre sobre V8 y tiene la gran habilidad de ser Non-Bloquing

Es Javascript fuera del browser

Eventos en el mundo real

var e = require('events').EventEmitter;
var event = new e();

event.on('hola', function (data) {
  console.log('alguien dijo hola! y ademas dijo:'+data);
});

event.emit('hola','Soy daniel');

Eventos en la maquina

var e = require('events').EventEmitter;
var event = new e();

setInterval(function(){
	event.emit('endProcess',{name:'readFile',filecontent:'Nothing'});
},3000)

setInterval(function(){
	event.emit('endProcess',{name:'writeFile',filecontent:'Something'});
},7000)


event.on('endProcess', function (data) {
  	console.log('Proceso Terminado');
	console.log(data)
});

Loose coupling

o Mas informacion sobre eventos

Como hacer un emisor de eventos en javascript

Arquitectura escalable para Aplicaciones de javascript

Blocking vs Non Blocking

Hay 2 maneras de correr process en node.js

Leer archivos de manera blocking

var fs = require('fs');

console.log('empezando ejemplo');
var dir = fs.readdirSync('./');
console.log(dir);
console.log('terminando ejemplo');

Leer archivos de manera blocking

var fs = require('fs');

console.log('empezando ejemplo');
fs.readdir('./',function(err,data){
	console.log(data);
});
console.log('terminando ejemplo');

Concurecia con Node

Eventos vs Treads

Node puede soportar muchas conecciones por que solo gasta recursos mientras se procesas los eventos

En otras palabras, mientras que a Apache le asigna recursos cada coneccion, Nodejs solo los utiliza mientras se procesas los evento de cada coneccion

Platica de Douglas Crockford

Entonces para que sirve Nodejs?

Permite generar

Http server

O node.js hello world

var http = require('http');
	http.createServer(function (req, res) {
	  res.writeHead(200, {'Content-Type': 'text/plain'});
	  res.end('Hello World\n');
	}).listen(8124, "127.0.0.1");
	console.log('Server running at http://127.0.0.1:8124/');

NPM

O node package manager

Se utiliza para instalar y publicar tus programas de node, ademas de manejar las dependencias.

Es el equivalente de gemas de ruby

Express

High performance, high class web development for Node.js

Es un framework de estilo Sinatra

Corre sobre connect

Alternativas Meryl

Express

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

	app.listen(3000);

Creando nuestros propios modulos

function someThing() {
	this.someProperty = '';
}

someThing.prototype = {
	setValue : function(str){
		this.someProperty = str;
	},
	getValue : function(){
		return this.someProperty;
	}
}
module.exports = new someThing();

Exportar variables

Separando el codigo en pequenos controladores

A la manera de Express https://github.com/visionmedia/express/tree/master/examples/mvc

module.exports = {
		index: function(req, res){
			res.render();
		}
	};
var events = require('./controllers/events'),
	home = require('./controllers/home');

app.get('/', home.home);
app.get('/events', events.list);

Usar un template engine

Usaremos Jade http://jade-lang.com/

Jade sobre Express https://github.com/visionmedia/express/blob/master/examples/jade/app.js

app.set('views', __dirname + '/views');
	app.set('view engine', 'jade');
	
	app.get('/', function(req, res){
		res.render('users', { users: users });
	});

Ejemplo de Jade

!!! 5
html(lang="en")
  head
	title= pageTitle
	script(type='text/javascript')
	  if (foo) {
		 bar()
	  }
  body
	h1 Jade - node template engine
	#container
	  - if (youAreUsingJade)
		p You are amazing
	  - else
		p Get on it!

Modelos

Dependiendo tu base de datos