<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Node.js Hispano</title>
	<atom:link href="http://www.nodehispano.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.nodehispano.com</link>
	<description>Node.js - JavaScript en el Servidor  - Comunidad en Español</description>
	<lastBuildDate>Wed, 10 Apr 2013 17:10:23 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Creando aplicaciones Node.js con TypeScript – Parte 2 #nodejs</title>
		<link>http://www.nodehispano.com/2013/04/creando-aplicaciones-node-js-con-typescript-parte-2-nodejs/</link>
		<comments>http://www.nodehispano.com/2013/04/creando-aplicaciones-node-js-con-typescript-parte-2-nodejs/#comments</comments>
		<pubDate>Wed, 10 Apr 2013 17:10:23 +0000</pubDate>
		<dc:creator>carlosro_ec</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[jade]]></category>
		<category><![CDATA[Node]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[typescript]]></category>

		<guid isPermaLink="false">http://www.nodehispano.com/?p=293</guid>
		<description><![CDATA[Accediendo a la base de datos Editamos el fichero db.ts y añadimos aquí el código que accede a nuestra base de datos MongoDB. Para ello, importamos el módulo de mongodb y creamos una instancia de la clase mongodb, establecemos la &#8230; <a href="http://www.nodehispano.com/2013/04/creando-aplicaciones-node-js-con-typescript-parte-2-nodejs/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;"><strong>Accediendo a la base de datos</strong></p>
<p style="text-align: justify;">Editamos el fichero <b>db.ts</b> y añadimos aquí el código que accede a nuestra base de datos MongoDB. Para ello, importamos el módulo de <i>mongodb</i> y creamos una instancia de la clase mongodb, establecemos la conexión con la base de datos y la abrimos:</p>
<pre class="brush: javascript; gutter: true">import mongodb = module(&#039;mongodb&#039;);
var server = new mongodb.Server(&#039;localhost&#039;, 27017, {auto_reconnect: true}, {})
var db = new mongodb.Db(&#039;highscores&#039;, server);
db.open(function() {});</pre>
<p style="text-align: justify;">Una vez abierta la conexión, definimos una clase que describe los objetos que esperamos enviar/recibir de la colección &#8220;highscores&#8221;. Esta es una de las ventajas de utilizar TypeScript, que nos permite definir y trabajar con clases, e indicar el tipo de los parámetros de nuestras funciones.</p>
<pre class="brush: javascript; gutter: true">export class Score {
    _id: string;
    user: string;
    score : number;
}</pre>
<p style="text-align: justify;">Ahora podremos definir las funciones que expone este módulo. Veremos que hay ciertos elementos nuevos con respecto a una definición en JavaScript.</p>
<pre class="brush: javascript; gutter: true">export function getScores(callback: (scores: Score[]) =&gt; void) {

    db.collection(&#039;scores&#039;, function(error, scores_collection) {
        if(error) { console.error(error); return; }
        scores_collection.find({}).toArray(function(error, scoresobj) {
           if(error) { console.error(error); return; }
           callback(scoresobj);
        });
        
    });
}</pre>
<p style="text-align: justify;">La primera la vemos en los parámetros, estamos indicando que tendremos un callback, que será de tipo <i>void</i> (esto es, que no devuelve nada) la cual recibirá una lista de objetos de tipo <i>Score</i> (la clase que acabamos de definir). Este callback será la función anónima que acabamos de definir en el módulo index:</p>
<pre class="brush: javascript; gutter: true">(scores) =&gt; {
        res.render(&#039;index&#039;, { title: &#039;Highscores&#039;, scores: scores })
}</pre>
<p style="text-align: justify;">El resto de una función es la típica que provee el módulo de mongoDB. Pero ya podemos ver la facilidad con la que podríamos cambiar el servidor al que nos conectamos o incluso el repositorio de datos&#8230;</p>
<p style="text-align: justify;"><strong>Definiendo las vistas</strong></p>
<p style="text-align: justify;">Gracias a JadeJS podemos cambiar el aspecto de la UI de una forma muy sencilla. En nuestro caso sólo vamos a definir una vista en la que mostrar la lista de puntuaciones. Para ello creamos 2 ficheros: <b>layout.jade</b> para tener unos elementos comunes e <b>index.jade</b> para mostrar la lista:</p>
<p style="text-align: justify;"><em><b>layout.jade</b></em></p>
<pre class="brush: javascript; gutter: true">!!!
html
  head
    title ImageBoard
    link(rel=&#039;stylesheet&#039;, href=&#039;http://cachedcommons.org/cache/960/0.0.0/stylesheets/960.css&#039;)
    link(rel=&#039;stylesheet&#039;, href=&#039;/stylesheets/style.css&#039;)
  body
    #header.container_12
      script(src=&#039;http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.min.js&#039;)
    #container.container_12!= body

index.jade
h1= title
p Welcome to #{title}

ul
- each score in scores
  li
    b= score.user + &quot; &quot; + score.score</pre>
<p style="text-align: justify;"><em> <b>index.jade</b></em></p>
<pre class="brush: javascript; gutter: true">h1= title
p Welcome to #{title}

ul
- each score in scores
  li
    b= score.user + &quot; &quot; + score.score</pre>
<p style="text-align: justify;">No es intención de este artículo explicar cómo utilizar Jade, pero vemos que podemos recorrer de una forma muy sencilla una lista de elementos, en nuestro caso la clasificación de puntuaciones, y mostrarlas en una página.</p>
<p style="text-align: justify;">Si desde SublimeText compilamos el fichero <b>app.ts</b> podremos ver cómo se generan todos los ficheros JavaScript que serán los que utilice nuestra aplicación. Gracias a la Build Definition que hemos creado anteriormente, no es necesario hacerlo por cada fichero <i>.ts</i>, sino que se hace automáticamente para todos los que necesitamos. Y ya podemos arrancar la aplicación:</p>
<pre class="brush: javascript; gutter: true">node app.js</pre>
<p style="text-align: justify;">y abrimos un navegador para ver el resultado:</p>
<p style="text-align: justify;"><a href="http://www.nodehispano.com/wp-content/uploads/tuto_3.png"><img class="aligncenter size-full wp-image-294" alt="tuto_3" src="http://www.nodehispano.com/wp-content/uploads/tuto_3.png" width="794" height="350" /></a></p>
<p style="text-align: justify;">Podemos ver que la página se renderiza correctamente pero no nos muestra ningún resultado, esto es normal puesto que no tenemos ningún registro en nuestra colección MongoDB. Vamos a hacer una página para insertar registros.</p>
<p style="text-align: justify;"><strong>Añadiendo más funcionalidades</strong></p>
<p style="text-align: justify;">Siguiendo el mismo proceso que antes, lo primero que hacemos es modificar nuestro fichero de aplicación (<b>app.ts</b>) para añadir dos métodos nuevos, un GET que cargue un formulario y un POST para insertar los datos:</p>
<p style="text-align: justify;">
<pre class="brush: javascript; gutter: true">app.get(&#039;/scores/newscore&#039;, (req, res) =&gt; {
    routes.newscoreget(req, res);    
});

app.post(&#039;/scores/newscore&#039;, (req, res) =&gt; {
   routes.newscorepost(req, res);
});</pre>
<p style="text-align: justify;">Definimos los nuevos métodos en nuestro fichero <em><b>index.ts</b></em>:</p>
<pre class="brush: javascript; gutter: true">export function newscoreget(req: express.ExpressServerRequest, res: express.ExpressServerResponse){
     res.render(&#039;newscore&#039;,{});   
};

export function newscorepost (req: express.ExpressServerRequest, res: express.ExpressServerResponse){
    var newscore = new db.Score()
    newscore.user = req.param(&#039;user&#039;);
    newscore.score = req.param(&#039;score&#039;);
     db.addScore(newscore, (r) =&gt; {
        res.redirect(&#039;/&#039;);
    });
};</pre>
<p style="text-align: justify;">Como vemos, el primero únicamente renderiza el formulario y es el segundo método el que llamará a nuestro módulo de acceso a datos. En este segundo método utilizamos un objeto de la clase <i>Score</i> que hemos definido en otro módulo, que será lo que pasemos como parámetro al método addScore. Veamos cómo implementamos este método:</p>
<pre class="brush: javascript; gutter: true">export function addScore(newscore : Score, callback: (result: any)=&gt; void){
    db.collection(&#039;scores&#039;, function(error, scores_collection) {
        if (error) { console.error(error); return; }
        scores_collection.insert({&quot;user&quot; : newscore.user, &quot;score&quot; : newscore.score },
            (error, result) =&gt; {
                if(error) { console.error(error); return; }
                callback(result);
            })
        });
}</pre>
<p style="text-align: justify;">Gracias a que utilizamos una clase de TypeScript, podemos ver sus propiedades cuando las necesitemos:</p>
<p style="text-align: justify;"><a href="http://www.nodehispano.com/wp-content/uploads/tuto_4.png"><img class="aligncenter size-full wp-image-295" alt="tuto_4" src="http://www.nodehispano.com/wp-content/uploads/tuto_4.png" width="991" height="244" /></a></p>
<p style="text-align: justify;">Y por último, creamos la vista <em><b>newscore.jade</b></em> con el formulario en el que añadimos el usuario y la puntuación:</p>
<pre class="brush: javascript; gutter: true">form( method=&quot;post&quot;)
   div
       br
       div
           span.inputtitle User name :
           input(type=&quot;text&quot;, name=&quot;user&quot;)
       br
       div
           span.inputtitle Score :
           input(type=&quot;text&quot;, name=&quot;score&quot;)
       br
       #editScoreSubmit
           input.button(type=&quot;submit&quot;, value=&quot;Save Score&quot;)</pre>
<p style="text-align: justify;">Y modificamos nuestra vista principal para añadirle un botón que llame a nuestra recién creada vista:</p>
<pre class="brush: javascript; gutter: true">h1= title
p Welcome to #{title}

ul
- each score in scores
  li
    b= score.user + &quot; &quot; + score.score
br
form( action=&quot;/scores/newscore/&quot;, method=&quot;get&quot;)
    div
        #newScoreSubmit
            input.button(type=&quot;submit&quot;, value=&quot;New Score&quot;)</pre>
<p style="text-align: justify;">Volvemos a compilar el fichero <b>app.ts</b> y arrancamos la aplicación, si todo ha ido bien ya podremos acceder al formulario para añadir puntuaciones:</p>
<p style="text-align: justify;"><a href="http://www.nodehispano.com/wp-content/uploads/tuto_5.png"><img class="aligncenter size-full wp-image-296" alt="tuto_5" src="http://www.nodehispano.com/wp-content/uploads/tuto_5.png" width="668" height="325" /></a>Y ver el resultado en la página principal:</p>
<p style="text-align: justify;"><a href="http://www.nodehispano.com/wp-content/uploads/tuto_6.png"><img class="aligncenter size-full wp-image-297" alt="tuto_6" src="http://www.nodehispano.com/wp-content/uploads/tuto_6.png" width="783" height="427" /></a></p>
<p style="text-align: justify;"><strong>RESUMIENDO</strong></p>
<p style="text-align: justify;">Este pequeño ejemplo nos ha servido para ver cómo se puede hacer una aplicación web con NodeJS y TypeScript con una buena estructura, el código bien organizado y siguiendo el patrón MVC. Esto nos permite que, si la aplicación es muy grande, el trabajo se pueda repartir entre diferentes personas/grupos de manera muy sencilla. Además, podemos tener definidos módulos de prueba (fakes) que simulen funcionalidades que no están desarrolladas.</p>
<h2>Autor de éste Artículo</h2>
<p><strong>Pablo Bouzada</strong>, desarrollador especializado en .NET y otras tecnologías Microsoft. Consultor en <a href="http://www.pasiona.com/">Pasiona Consulting</a> y divulgador tecnológico en <a title="Tendencias" href="http://techdencias.azurewebsites.net/">Techdencias</a>. Colaborador de <a href="http://programandonet.com/web/">programandonet.com</a> y otros grupos de usuarios de España.</p>
<p>Twitter: <a href="https://twitter.com/pbousan">@pbousan</a></p>
<p>Slideshare: <a href="http://www.slideshare.net/pbousan">http://www.slideshare.net/pbousan</a></p>
<p>GitHub: <a href="https://github.com/pbousan?tab=repositories">https://github.com/pbousan?tab=repositories</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nodehispano.com/2013/04/creando-aplicaciones-node-js-con-typescript-parte-2-nodejs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creando aplicaciones Node.js con TypeScript &#8211; Parte 1 #nodejs</title>
		<link>http://www.nodehispano.com/2013/04/creando-aplicaciones-node-js-con-typescript-parte-1-nodejs/</link>
		<comments>http://www.nodehispano.com/2013/04/creando-aplicaciones-node-js-con-typescript-parte-1-nodejs/#comments</comments>
		<pubDate>Mon, 08 Apr 2013 15:53:15 +0000</pubDate>
		<dc:creator>carlosro_ec</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[nodejs]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[typescript]]></category>

		<guid isPermaLink="false">http://www.nodehispano.com/?p=287</guid>
		<description><![CDATA[TypeScript es la respuesta de Microsoft a la necesidad de crear aplicaciones web robustas y mantenibles utilizando JavaScript. Esto lo consigue mediante: Código más homogéneo y mantenible Comprobación estática de tipos (opcional y de momento sólo con Visual Studio) Object &#8230; <a href="http://www.nodehispano.com/2013/04/creando-aplicaciones-node-js-con-typescript-parte-1-nodejs/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;"><strong>TypeScript</strong> es la respuesta de <strong>Microsoft</strong> a la necesidad de crear aplicaciones web robustas y mantenibles utilizando JavaScript. Esto lo consigue mediante:</p>
<ul style="text-align: justify;">
<li>Código más homogéneo y mantenible</li>
<li>Comprobación estática de tipos (opcional y de momento sólo con Visual Studio)</li>
<li>Object Oriented Programming: clases, herencia e interfaces</li>
<li>Separation of Concerns (SoC): mediante la organización del código en módulos que se pueden cargar de forma dinámica</li>
</ul>
<p style="text-align: justify;">En este link: <a href="http://programandonet.com/web/primeros-pasos-con-typescript/">http://programandonet.com/web/primeros-pasos-con-typescript/</a> tenéis un tutorial sobre las features básicas de TypeScript.</p>
<p style="text-align: justify;">A diferencia de otros lenguajes que compilan JavaScript, como pueden ser Dart o CoffeScript, TypeScript es un superconjunto de JavaScript, por lo que en esencia es JavaScript.</p>
<p style="text-align: justify;"><a href="http://www.nodehispano.com/wp-content/uploads/tuto-1.png"><img class="aligncenter size-full wp-image-288" alt="tuto-1" src="http://www.nodehispano.com/wp-content/uploads/tuto-1.png" width="485" height="399" /></a></p>
<p style="text-align: justify;">Por tanto, si ya conocemos JavaScript, no tendremos ningún problema para utilizar TypeScript. La curva de aprendizaje de este nuevo lenguaje será realmente suave, pudiendo conseguir grandes resultados desde el principio. Además, al ser JavaScript, TypeScript nos permite seguir utilizando todas las librerías que conocemos hasta ahora (JQuery, Backbone, Knockout, …)</p>
<p style="text-align: justify;">Hay que destacar también que TypeScript es un proyecto Open Source, y se puede descargar su código fuente (además de varios ejemplos) desde aquí: <a href="http://typescript.codeplex.com/">http://typescript.codeplex.com/</a> Actualmente se encuentra en la versión 0.8.3, y como podéis ver en este roadmap, en la versión final (1.0) estará completamente alineado con la versión 6 de ECMAScript, que traerá de serie alguna de las novedades que ya implementa TypeScript.</p>
<p style="text-align: justify;">Existen varias formas de utilizar este nuevo lenguaje. La primera sería con proyectos creados con Visual Studio 2012 y el plugin de TypeScript. La segunda, que será sobre la que desarrollemos este artículo, es utilizar el paquete de Node.js y alguno de los IDEs que lo soporta (Sublime Text, Vim, Emacs,&#8230;). Para este artículo hemos decidido utilizar Sublime Text, ya que es uno de los que se integra mejor con TypeScript, exceptuando Visual Studio. En este link tenéis los pasos para utilizar TypeScript en Sublime Text tanto el syntax highlighter como la forma de crear una System Build que compile TypeScript:</p>
<p style="text-align: justify;">Instalar el paquete de TypeScript para Node.js</p>
<pre class="brush: javascript; gutter: true">npm install -g typescript</pre>
<p style="text-align: justify;">-   Para instalar el syntax highlighter, que te puedes descargar desde este link, sólo hace falta copiar el fichero <i>typescript.tmplanguage</i> en tu directorio de paquetes de Sublime Text.</p>
<p style="text-align: justify;">-  Y sólo falta añadir un Build System para que compile los ficheros TypeScript. Para ello, abrimos Sublime Text, y en <b>Tools –&gt; Build System –&gt; New Build System</b>, añadir lo siguiente:</p>
<pre class="brush: javascript; gutter: true">{
&quot;selector&quot;: &quot;source.ts&quot;,
&quot;cmd&quot;: [&quot;tsc.cmd&quot;, &quot;$file&quot;],
&quot;file_regex&quot;: &quot;^(.+?) \\((\\d+),(\\d+)\\): (.+)$&quot;
}</pre>
<p style="text-align: justify;">Y con esto ya podemos compilar los fichero TypeScript (con extensión .ts) en sus correspondientes JavaScript simplemente presionando <b>Ctrl+B</b></p>
<p style="text-align: justify;"><strong>MANOS A LA OBRA</strong></p>
<p style="text-align: justify;">Vamos a desarrollar una aplicación muy básica: el sistema de puntuaciones de un juego. Que está basado uno de los ejemplos disponibles en el repositorio de TypeScript en Codeplex (<a href="http://www.typescriptlang.org/Samples/#ImageBoard)">http://www.typescriptlang.org/Samples/#ImageBoard)</a>, en la que utilizaremos una serie de paquetes Node que harán nuestro trabajo más sencillo:</p>
<ul style="text-align: justify;">
<li>ExpressJS para articular la estructura de la aplicación</li>
<li>Node-MongoDB para conectar con la base de datos</li>
<li>JadeJS como motor de gestión de vistas</li>
</ul>
<p style="text-align: justify;">Para este ejemplo es necesario, además de Node.js, tener MongoDB instalado, si no lo tenéis, podéis seguir estos pasos para instalar MondoDB en vuestro equipo.</p>
<p style="text-align: justify;">Crearemos una estructura muy sencilla de directorios que nos permita tener las diferentes &#8220;capas&#8221; de la aplicación separadas, ya que usaremos una arquitectura MVC, tenéis disponible todo el código de este artículo en este repositorio de Github . A lo largo del artículo veremos las ventajas de tener los ficheros separados por funcionalidades de esta forma:</p>
<p style="text-align: justify;">/node_modules<br />
/public<br />
&#8211; /stylesheets<br />
/routes<br />
&#8211; index.ts<br />
/views<br />
&#8211; index.jade<br />
&#8211; newscore.jade<br />
&#8211; layout.jade<br />
app.ts<br />
db.ts<br />
express.d.ts<br />
mongodb.ts<br />
node.d.ts<br />
package.json</p>
<p style="text-align: justify;">Lo primero que haremos será crear el fichero de definición de paquetes para poder instalarlos. Este será nuestro package.json:</p>
<pre class="brush: javascript; gutter: true">{
    &quot;name&quot;: &quot;application-name&quot;
  , &quot;version&quot;: &quot;0.0.1&quot;
  , &quot;private&quot;: true
  , &quot;dependencies&quot;: {
      &quot;express&quot;: &quot;2.5.8&quot;
      , &quot;ejs&quot;: &quot;&gt;= 0.5.0&quot;
      , &quot;jade&quot;: &quot;&gt;= 0.0.1&quot;
      , &quot;mongodb&quot;: &quot;&gt;= 1.0.0&quot;
  }
}</pre>
<p style="text-align: justify;">Y los instalamos con la instrucción:</p>
<pre class="brush: javascript; gutter: true">npm install</pre>
<p style="text-align: justify;">Con lo que veremos que se añaden los paquetes necesarios a nuestra carpeta node_modules.</p>
<p style="text-align: justify;">A continuación vamos a editar el fichero principal de la aplicación, en nuestro caso será <b>app.ts</b>, que la extensión sea <i>.ts</i> indica que se trata de un fichero con código TypeScript. En este fichero es donde usaremos ExpressJS para establecer el enrutamiento que aceptará nuestra aplicación. Para una guía de uso de Express Framework os recomiendo esta de Javier Viola, en este artículo nos centraremos en la implementación con TypeScript.</p>
<p style="text-align: justify;">Antes de nada, debemos añadir las referencias de lo que vamos a utilizar, esto en TypeScript se hace con la siguiente línea:</p>
<pre class="brush: javascript; gutter: true">///&lt;reference path=&#039;node.d.ts&#039; /&gt;</pre>
<p style="text-align: justify;">Los ficheros con extensión <i>*.d.ts</i> indican que dicho fichero tendrá la definición de elementos (módulos, interfaces, clases, variables globales y funciones) que necesita TypeScript para importarlos a la hora de compilar. Pero estos ficheros no generan ningún fichero JavaScript, son simplemente definiciones en TypeScript de librerías JavaScript. Por tanto, igual que los ficheros <i>.ts</i>, no es necesario que se desplieguen en los servidores de producción.</p>
<p style="text-align: justify;"><b>Nota:</b> la extensión .d.ts es una convención y puede que nos encontremos ficheros de definiciones sin ella, ya que no es obligatoria. Estos ficheros de definición son mantenidos por la comunidad de desarrolladores ya que comentaba antes, TypeScript es un proyecto Open Source.</p>
<p style="text-align: justify;">Una vez referenciado el fichero de definiciones que nos permite trabajar con el paquete de Node, procedemos a importar los módulos que utilizaremos en nuestra aplicación:</p>
<pre class="brush: javascript; gutter: true">import http = module(&quot;http&quot;)
import url = module(&quot;url&quot;)
import routes = module(&quot;./routes/index&quot;)
import db = module(&quot;./db&quot;)
import express = module(&quot;express&quot;)</pre>
<p style="text-align: justify;">Estos <i>import</i> serán traducidos a instrucciones del tipo <i>var express = require(‘express’);</i> siempre que sean necesarias, ya que, como comentábamos antes, TypeScript necesita definiciones para saber qué compilar, aunque a veces no tiene un reflejo en el JavaScript resultante.</p>
<p style="text-align: justify;">Creamos una instancia del objeto <i>express</i> y procedemos a configurarlo. Podemos ver como con TypeScript las funciones anónimas pasan a ser <i>() =&gt;{…}</i>, que son expresiones lambda, luego veremos cómo quedan tras compilar:</p>
<pre class="brush: javascript; gutter: true">var app = express.createServer();

// Configuration
app.configure(() =&gt; {
  app.set(&#039;views&#039;, __dirname + &#039;/views&#039;);
  app.set(&#039;view engine&#039;, &#039;jade&#039;);
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.static(__dirname + &#039;/public&#039;));
});

app.configure(&#039;development&#039;, () =&gt; {
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.configure(&#039;production&#039;, () =&gt; {
  app.use(express.errorHandler());
});</pre>
<p style="text-align: justify;">Ahora asignamos las rutas al que aceptará nuestra aplicación. Como dijimos anteriormente será algo muy sencillo y simplemente tendremos la opción de hacer llamadas GET, que devuelve la lista completa de puntuaciones, y un POST para añadir nuevos elementos. Empecemos sólo con el GET:</p>
<pre class="brush: javascript; gutter: true">// Routes
app.get(&#039;/&#039;, routes.index);

app.listen(3000, function(){
    console.log(&quot;Demo Express server listening on port %d in %s mode&quot;, 3000, app.settings.env);
});

export var App = app;</pre>
<p style="text-align: justify;">Para comprobar que todo está correcto, compilamos el fichero <b>app.ts</b> y obtenemos su correspondiente fichero JavaScript:</p>
<p style="text-align: justify;"><a href="http://www.nodehispano.com/wp-content/uploads/tuto-2.png"><img class="aligncenter size-full wp-image-289" alt="tuto-2" src="http://www.nodehispano.com/wp-content/uploads/tuto-2.png" width="1216" height="652" /></a></p>
<p style="text-align: justify;">Vamos a crear un fichero con el nombre <b>index.ts</b>, que se trataría de nuestro &#8220;Controlador&#8221; (recordemos que vamos a seguir el patrón MVC) dentro de nuestra carpeta <i>/routes</i> y añadimos el siguiente código:</p>
<pre class="brush: javascript; gutter: true">// Importamos los módulos que vamos a utilizar
import express = module(&quot;express&quot;)
import db = module(&quot;../db&quot;)

// Y exponemos un método que devuelva los elementos de la tabla &quot;highscores&quot;.
export function index(req: express.ExpressServerRequest, res: express.ExpressServerResponse){
    db.getScores(function(scores) {
        res.render(&#039;index&#039;, { title: &#039;Highscores&#039;, scores: scores })
    });
};</pre>
<p style="text-align: justify;">Como vemos, hacemos referencia al módulo &#8220;<i>db</i>&#8221; y llamamos a un método <i>getScores</i>. Esto lo hacemos así para separar el acceso a datos del sistema de rutas y de la generación de las vistas.</p>
<p style="text-align: justify;">
<h2>Autor de éste Artículo</h2>
<p style="text-align: justify;"><strong>Pablo Bouzada</strong>, desarrollador especializado en .NET y otras tecnologías Microsoft. Consultor en <a href="http://www.pasiona.com/">Pasiona Consulting</a> y divulgador tecnológico en <a title="Tendencias" href="http://techdencias.azurewebsites.net/">Techdencias</a>. Colaborador de <a href="http://programandonet.com/web/">programandonet.com</a> y otros grupos de usuarios de España.</p>
<p style="text-align: justify;">Twitter: <a href="https://twitter.com/pbousan">@pbousan</a></p>
<p style="text-align: justify;">Slideshare: <a href="http://www.slideshare.net/pbousan">http://www.slideshare.net/pbousan</a></p>
<p style="text-align: justify;">GitHub: <a href="https://github.com/pbousan?tab=repositories">https://github.com/pbousan?tab=repositories</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nodehispano.com/2013/04/creando-aplicaciones-node-js-con-typescript-parte-1-nodejs/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Guia express &amp; mongoose para Node.js – Parte II #nodejs</title>
		<link>http://www.nodehispano.com/2012/12/guia-express-mongoose-para-node-js-parte-ii-nodejs/</link>
		<comments>http://www.nodehispano.com/2012/12/guia-express-mongoose-para-node-js-parte-ii-nodejs/#comments</comments>
		<pubDate>Sun, 23 Dec 2012 16:50:45 +0000</pubDate>
		<dc:creator>carlosro_ec</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Express]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[moongose]]></category>
		<category><![CDATA[Node]]></category>
		<category><![CDATA[Node.js]]></category>

		<guid isPermaLink="false">http://www.nodehispano.com/?p=268</guid>
		<description><![CDATA[En la Parte I de este tutorial llegamos a manejar datos de nuestro repositorio local. Sin embargo, estos datos son dummy. Liberemos el poder de la base de datos MongoDB, recordemos que introdujimos este documento: &#62; db.productos.findOne() { &#34;_id&#34; : ObjectId(&#34;4fe6454a8c136cf49721359f&#34;), &#34;nombre&#34; &#8230; <a href="http://www.nodehispano.com/2012/12/guia-express-mongoose-para-node-js-parte-ii-nodejs/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;">En la <a title="Node.js Express y Mongoose" href="http://www.nodehispano.com/2012/06/guia-express-mongoose-para-node-js-parte-i-nodejs/">Parte I</a> de este tutorial llegamos a manejar datos de nuestro repositorio local.</p>
<p style="text-align: justify;">Sin embargo, estos datos son <em>dummy</em>. Liberemos el poder de la base de datos <code>MongoDB</code>, recordemos que introdujimos este documento:</p>
<div style="text-align: justify;">
<pre>&gt; db.productos.findOne()
{
  &quot;_id&quot; : ObjectId(&quot;4fe6454a8c136cf49721359f&quot;),
  &quot;nombre&quot; : &quot;Papas Fritas&quot;,
  &quot;descripcion&quot; : &quot;Crujientes, sabor mediterraneo&quot;,
  &quot;precio&quot; : 2.5
}</pre>
</div>
<p style="text-align: justify;">¿Cómo conectamos nuestra base de datos MongoDB usando node.js? Usando la librería <a href="http://mongoosejs.com/">mongoose</a>.</p>
<p style="text-align: justify;">El momento de la base de datos llegó, recordemos que al principio creamos el archivo <code>models/producto.js</code>:</p>
<ul style="text-align: justify;">
<li>models/producto.js</li>
</ul>
<div style="text-align: justify;">
<pre>var Schema = require(&#039;mongoose&#039;).Schema

var producto_schema = new Schema({
  nombre        :   String,
  descripcion   :   String,
  precio        :   Number
})

var Producto = module.exports = producto_schema</pre>
</div>
<p style="text-align: justify;">&#8230; Y, Modifiquemos nuestros archivos de la siguiente manera:</p>
<ul style="text-align: justify;">
<li>package.json</li>
</ul>
<div style="text-align: justify;">
<pre>{
    &quot;name&quot;: &quot;herman-mongoose-suggestion&quot;
  , &quot;version&quot;: &quot;1.0.0&quot;
  , &quot;dependencies&quot;: {
      &quot;express&quot;     : &quot;2.5.8&quot;
    , &quot;jade&quot;        : &quot;0.25.x&quot;
    , &quot;mongoose&quot;    : &quot;2.5.10&quot;
  }
}</pre>
</div>
<p style="text-align: justify;">Una vez modificado <code>package.json</code>, no olvidemos de actualizar nuestro modulos de node via <code>npm install -f</code> en el directorio de nuestra aplicación.</p>
<ul style="text-align: justify;">
<li>controllers/producto.js</li>
</ul>
<div style="text-align: justify;">
<pre>// Creación de la Conexión
var mongoose        = require(&#039;mongoose&#039;)
  , db_lnk          = &#039;mongodb://localhost/supermercado&#039;
  , db              = mongoose.createConnection(db_lnk)

// Creación de variables para cargar el modelo
var producto_schema = require(&#039;../models/producto&#039;)
  , Producto = db.model(&#039;Producto&#039;, producto_schema)</pre>
</div>
<p style="text-align: justify;">Ahora, existe, por supuesto la posibilidad de montar de una manera general la conexión para toda la aplicación. No la tocaremos sin embargo en este tutorial.</p>
<p style="text-align: justify;">Modificamos la función <code>exports.index</code>, siempre dentro de <code>controllers/producto.js</code>para que recoja los productos:</p>
<ul style="text-align: justify;">
<li>controllers/producto.js</li>
</ul>
<div style="text-align: justify;">
<pre>exports.index = function (req, res, next) {

  Producto.find(gotProducts)

  // NOTA: Creo que es bueno usar verbos en inglés para las funciones,
  //       por lo cómodo que son en estos casos (get, got; find, found)
  function gotProducts (err, productos) {
    if (err) {
      console.log(err)
      return next()
    }

    return res.render(&#039;index&#039;, {title: &#039;Lista de Productos&#039;, productos: productos})
  }
}</pre>
</div>
<p style="text-align: justify;">Nótese la estructura de callbacks: Cuando se pide la lista de productos, sólo al llegar la respuesta invocamos a <code>gotProducts</code>, el cual llama a la renderización a través de <code>res.render</code> de la página. Para los que vienen de otros lenguajes esta manera de modelar puede ser confusa al principio. Pero tiene sus ventajas en el escenario web, el cual, a mi parecer es completamente orientado al evento.</p>
<p style="text-align: justify;">Tenemos listo el back-end! Ya tenemos una lista de productos, ejecutamos? Aún no, ya que <code>res.render</code> cargaría el <em>template</em> <em>jade</em>, pero no le está insertando los datos. Por lo que modificaremos <code>views/index.jade</code> para tal efecto:</p>
<ul style="text-align: justify;">
<li>views/index.jade</li>
</ul>
<div style="text-align: justify;">
<pre>h2 Tabla de Productos
table(border=&#039;1&#039;)
  tr
    th Producto
    th Descripción
    th Precio
  - if (productos)
    - each producto in productos
      tr
        td
          a(href=&quot;/producto/&quot; + producto._id.toString()) #{producto.nombre}
        td #{producto.descripcion}
        td #{producto.precio}</pre>
</div>
<p style="text-align: justify;">Bien. <code>CTRL+C</code>, <code>$ node app.js </code>y veamos el resultado:</p>
<p style="text-align: justify;"><a href="http://www.nodehispano.com/2012/12/guia-express-mongoose-para-node-js-parte-ii-nodejs/node-1/" rel="attachment wp-att-270"><img class="aligncenter size-full wp-image-270" alt="Node.js Express Mongoose Guia 5" src="http://www.nodehispano.com/wp-content/uploads/node-1.png" width="1092" height="733" /></a></p>
<h4 style="text-align: justify;"><a href="https://github.com/hermanjunge/herman-mongoose-tutorial#p%C3%A1gina-de-edici%C3%B3n-de-un-producto-get-productoid" name="p%C3%A1gina-de-edici%C3%B3n-de-un-producto-get-productoid"></a>Página de Edición de un Producto (GET /producto/:id)</h4>
<p style="text-align: justify;">Si clickamos en el link del primer producto obtenidos, tendremos un mensaje que no podemos ver el producto. Tomaremos las medidas para ello.</p>
<p style="text-align: justify;">En general, se pueden dar buenos argumentos para no usar la misma id de producto de la base de datos como indicador <code>id</code> para la ruta. Pero recordemos que estamos en un ejemplo didáctico. Necesitaremos desarrollar (Y aquí veremos lo atractivo que es el paradigma MVC), una función de controlador y una vista, no necesitaremos en este ejemplo hacer funciones de modelos, dado que mongoose nos entrega todo. En la medida que veamos más complejidad, es necesario encapsular las funciones de mongoose y las lógicas que necesitemos en funciones de modelo.</p>
<ul style="text-align: justify;">
<li>controllers/producto.js</li>
</ul>
<div style="text-align: justify;">
<pre>exports.show_edit = function (req, res, next) {

  // Obtención del parámetro id desde la url
  var id = req.params.id

  Producto.findById(id, gotProduct)

  function gotProduct (err, producto) {
    if (err) {
      console.log(err)
      return next(err)
    }

    return res.render(&#039;show_edit&#039;, {title: &#039;Ver Producto&#039;, producto: producto})
  }
}</pre>
</div>
<p style="text-align: justify;">Mongoose nos ahorra muchos problemas de desarrollo, tiene la función <code>findById</code>, (<a href="http://mongoosejs.com/docs/2.7.x/docs/finding-documents.html">Ver documento</a>), la que, dado un <code>id</code> en string, devuelve el objecto correspondiente (o null, si no existe)</p>
<p style="text-align: justify;">Necesitamos renderizar el objecto. Acá usaremos la misma plantilla para edición y mostrar el producto:</p>
<ul style="text-align: justify;">
<li>/views/show_edit.jade</li>
</ul>
<div style="text-align: justify;">
<pre>h2 #{title}
form(method=&#039;post&#039;)

  p
    label(for=&quot;nombre&quot;) Nombre:
      input(type=&#039;text&#039;, name=&#039;nombre&#039;, value=producto.nombre)

  p
    label(for=&quot;descripcion&quot;) Descripción:
      input(type=&#039;text&#039;, name=&#039;descripcion&#039;, size=100, value=producto.descripcion)

  p
    label(for=&quot;precio&quot;) Precio:
      input(type=&#039;text&#039;, name=&#039;precio&#039;, value=producto.precio)

  p
    input(type=&#039;submit&#039;, value=&#039;Guardar&#039;)</pre>
</div>
<p style="text-align: justify;">Obtenemos la siguiente pantalla:</p>
<p style="text-align: justify;"><a href="http://www.nodehispano.com/2012/12/guia-express-mongoose-para-node-js-parte-ii-nodejs/node-2/" rel="attachment wp-att-271"><img class="aligncenter size-full wp-image-271" alt="Node.js Express Mongoose Guia 6" src="http://www.nodehispano.com/wp-content/uploads/node-2.png" width="1116" height="766" /></a></p>
<p style="text-align: justify;">Sin embargo si presionamos el botón guardar cambios, nada ocurre. Es lo que habilitaremos en el siguiente apartado&#8230;</p>
<h4 style="text-align: justify;"><a href="https://github.com/hermanjunge/herman-mongoose-tutorial#enviar-los-cambios-de-un-producto-post-productoid" name="enviar-los-cambios-de-un-producto-post-productoid"></a>Enviar los cambios de un producto (POST producto/:id)</h4>
<p style="text-align: justify;">Este es un trabajo completo sólo en el controlador (ya que tenemos la vista y modelo en mongoose):</p>
<ul style="text-align: justify;">
<li>/controllers/producto.js</li>
</ul>
<div style="text-align: justify;">
<pre>exports.update = function (req, res, next) {
  var id = req.params.id

  var nombre      = req.body.nombre       || &#039;&#039;
  var descripcion = req.body.descripcion  || &#039;&#039;
  var precio      = req.body.precio       || &#039;&#039;

  // Validemos que nombre o descripcion no vengan vacíos
  if ((nombre=== &#039;&#039;) || (descripcion === &#039;&#039;)) {
    console.log(&#039;ERROR: Campos vacios&#039;)
    return res.send(&#039;Hay campos vacíos, revisar&#039;)
  }

  // Validemos que el precio sea número
  if (isNaN(precio)) {
    console.log(&#039;ERROR: Precio no es número&#039;)
    return res.send(&#039;Precio no es un número !!!!!&#039;)
  }

  Producto.findById(id, gotProduct)

  function gotProduct (err, producto) {
    if (err) {
      console.log(err)
      return next(err)
    }

    if (!producto) {
      console.log(&#039;ERROR: ID no existe&#039;)
      return res.send(&#039;ID Inválida!&#039;)
    } else {
      producto.nombre       = nombre
      producto.descripcion  = descripcion
      producto.precio       = precio

      producto.save(onSaved)
    }
  }

  function onSaved (err) {
    if (err) {
      console.log(err)
      return next(err)
    }

    return res.redirect(&#039;/producto/&#039; + id)
  }
}</pre>
</div>
<p style="text-align: justify;">Controlamos los errores de no ID y parámetros en blanco. A <code>next()</code> le estamos dando un parámetros. En iteraciones posteriores debemos configurar que si <code>next</code> recibe parámetros, entregarle un error 500 al usuario. Pasaremos de esta funcionalidad por ahora.</p>
<h4 style="text-align: justify;"><a href="https://github.com/hermanjunge/herman-mongoose-tutorial#borrar-un-producto-post-delete-productoid" name="borrar-un-producto-post-delete-productoid"></a>Borrar un Producto (POST /delete-producto/:id)</h4>
<p style="text-align: justify;">Cómo se mencionó arriba, se podría haber usado el verbo DELETE (haciendo <a href="http://www.endurasoft.com/Blog/post/X-HTTP-Method-Override.aspx">override de método</a>). Para hacer más simple el tutorial, se implementa en <code>GET</code>.</p>
<p style="text-align: justify;">Debemos agregar los links para el eliminado en la lista de productos, es decir en el template de jade:</p>
<ul style="text-align: justify;">
<li>views/index.jade</li>
</ul>
<div style="text-align: justify;">
<pre>h2 Tabla de Productos
table(border=&#039;1&#039;)
  tr
    th Producto
    th Descripción
    th Precio
    th &amp;nbsp;
  - if (productos)
    - each producto in productos
      tr
        td
          a(href=&quot;/producto/&quot; + producto._id.toString()) #{producto.nombre}
        td #{producto.descripcion}
        td #{producto.precio}
        td
          a(href=&quot;/delete-producto/&quot; + producto._id.toString()) Borrar</pre>
</div>
<p style="text-align: justify;"><a href="http://www.nodehispano.com/2012/12/guia-express-mongoose-para-node-js-parte-ii-nodejs/node-3/" rel="attachment wp-att-272"><img class="aligncenter size-full wp-image-272" alt="Node.js Express Mongoose Guia 7" src="http://www.nodehispano.com/wp-content/uploads/node-3.png" width="1116" height="766" /></a></p>
<p style="text-align: justify;">Y la funcionalidad correspondiente en el controlador:</p>
<ul style="text-align: justify;">
<li>/controllers/producto.js</li>
</ul>
<div style="text-align: justify;">
<pre>exports.remove = function (req, res, next) {
  var id = req.params.id

  Producto.findById(id, gotProduct)

  function gotProduct (err, producto) {
    if (err) {
      console.log(err)
      return next(err)
    }

    if (!producto) {
      return res.send(&#039;Invalid ID. (De algún otro lado la sacaste tú...)&#039;)
    }

    // Tenemos el producto, eliminemoslo
    producto.remove(onRemoved)
  }

  function onRemoved (err) {
    if (err) {
      console.log(err)
      return next(err)
    }

    return res.redirect(&#039;/&#039;)
  }
}</pre>
</div>
<p style="text-align: justify;">Nótese (con algo de humor por supuesto), como reaccionamos ante una id que no encontramos. Si bien asumimos que esta función es llamada dentro de la página de índice, es posible que los valores quieran ser ingresados directamente (ala REST). El desarrollador debe preveer esta conducta y crear los flujos adecuados.</p>
<p style="text-align: justify;">Cosas que podemos agregar: Hacer una función js de cliente para que despliegue un confirmador (está seguro?) y enviar vía AJAX la llamada a borrar el producto; Podemos cerciorarnos además que quien de la orden esté dentro de una sesión; Podemos agregar un token contra &#8220;Cross Site Request Forgery&#8221;, entre otros.</p>
<h4 style="text-align: justify;"><a href="https://github.com/hermanjunge/herman-mongoose-tutorial#agregar-un-producto-get-nuevo-producto" name="agregar-un-producto-get-nuevo-producto"></a>Agregar un Producto (GET /nuevo-producto)</h4>
<p style="text-align: justify;">Finalmente, la funcionalidad de agregar productos.</p>
<p style="text-align: justify;">La primera idea es que la función asociada a la ruta, <code>exports.create</code>, nos arroje un html con los campos en blanco:</p>
<ul style="text-align: justify;">
<li>/controllers/producto.js</li>
</ul>
<div style="text-align: justify;">
<pre>exports.create = function (req, res, next) {
  return res.render(&#039;show_edit&#039;, {title: &#039;Ver Producto&#039;, producto: {}})
}</pre>
</div>
<p style="text-align: justify;">Eso fue sencillo. Quisieramos agregar un link a esta misma página en la página de inicio:</p>
<p style="text-align: justify;"><a href="http://www.nodehispano.com/?attachment_id=273" rel="attachment wp-att-273"><img class="aligncenter size-full wp-image-273" alt="Node.js Express Mongoose Guia 8" src="http://www.nodehispano.com/wp-content/uploads/node-4.png" width="1116" height="766" /></a></p>
<ul style="text-align: justify;">
<li>/views/index.jade</li>
</ul>
<div style="text-align: justify;">
<pre>p
  a(href=&#039;/nuevo-producto&#039;) Nuevo Producto</pre>
</div>
<p style="text-align: justify;"><a href="http://www.nodehispano.com/2012/12/guia-express-mongoose-para-node-js-parte-ii-nodejs/node-9/" rel="attachment wp-att-274"><img class="aligncenter size-full wp-image-274" alt="Node.js Express Mongoose Guia 10" src="http://www.nodehispano.com/wp-content/uploads/node-9.png" width="1116" height="766" /></a></p>
<p style="text-align: justify;">Y la función de controlador <code>exports.create</code> debe ser modificada, crearemos un desvío según el metodo HTTP que ocupemos (GET o POST)</p>
<div style="text-align: justify;">
<pre>exports.create = function (req, res, next) {
  if (req.method === &#039;GET&#039;) {
    return res.render(&#039;show_edit&#039;, {title: &#039;Nuevo Producto&#039;, producto: {}})
  } else if (req.method === &#039;POST&#039;) {
    // Obtenemos las variables y las validamos
    var nombre      = req.body.nombre       || &#039;&#039;
    var descripcion = req.body.descripcion  || &#039;&#039;
    var precio      = req.body.precio       || &#039;&#039;

    // Validemos que nombre o descripcion no vengan vacíos
    if ((nombre=== &#039;&#039;) || (descripcion === &#039;&#039;)) {
      console.log(&#039;ERROR: Campos vacios&#039;)
      return res.send(&#039;Hay campos vacíos, revisar&#039;)
    }

    // Validemos que el precio sea número
    if (isNaN(precio)) {
      console.log(&#039;ERROR: Precio no es número&#039;)
      return res.send(&#039;Precio no es un número !!!!!&#039;)
    }

    // Creamos el documento y lo guardamos
    var producto = new Producto({
        nombre        : nombre
      , descripcion   : descripcion
      , precio        : precio
    })

    producto.save(onSaved)

    function onSaved (err) {
      if (err) {
        console.log(err)
        return next(err)
      }

      return res.redirect(&#039;/&#039;)
    }
  }  
}</pre>
</div>
<p style="text-align: justify;">Podemos hacer algunas pruebas:</p>
<p style="text-align: justify;"><a href="http://www.nodehispano.com/2012/12/guia-express-mongoose-para-node-js-parte-ii-nodejs/node-11/" rel="attachment wp-att-275"><img class="aligncenter size-full wp-image-275" alt="Node.js Express Mongoose Guia 12" src="http://www.nodehispano.com/wp-content/uploads/node-11.png" width="1116" height="766" /></a></p>
<p style="text-align: justify;"><a href="http://www.nodehispano.com/2012/12/guia-express-mongoose-para-node-js-parte-ii-nodejs/node-13/" rel="attachment wp-att-276"><img class="aligncenter size-full wp-image-276" alt="Node.js Express Mongoose Guia 13" src="http://www.nodehispano.com/wp-content/uploads/node-13.png" width="1116" height="766" /></a></p>
<p style="text-align: justify;">Y eso sería todo por este tutorial. Insisto, se pueden hacer muchas cosas más, pero el objetivo es introducir al lector en estas tecnologías. Personalmente hubiese hecho algún trabajo para manejar los errores y devolver un error 500, desarrollo de usuarios y sesiones, más javascript de cliente y otros. Para el futuro. Muchas gracias.</p>
<h2>Todo el código lo pueden encontrar en el repositorio: <a title="Repositorio GItHub" href="https://github.com/hermanjunge/herman-mongoose-tutorial">herman-mongoose-suggestion</a>,</h2>
<h2>Autor de éste Artículo</h2>
<p><strong>Herman Junge</strong>, Chileno. Aspirante a Programador Zen. Ingeniero en <strong><a title="Geekli.st" href="http://geekli.st/">Geekli.st</a></strong>, donde hace malabarismo en el stack NodeJS, MongoDB y Redis, entre otras tecnologías, alternando <em>features</em> tanto de <em>front</em>, como de <em>back-end</em>. En sus ratos libres reune energías para entender como las maquinas pueden aprender y ayudarnos en la recopilación y creación de conocimiento.</p>
<p>Twitter: <a href="https://twitter.com/#!/hermanjunge">@hermanjunge</a><br />
Geekli.st: <a title="Geekli.st" href="http://geekli.st/hermanjunge">http://geekli.st/hermanjunge</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nodehispano.com/2012/12/guia-express-mongoose-para-node-js-parte-ii-nodejs/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Taller Node.js + Socket.IO con Nacho Soto #nodejs</title>
		<link>http://www.nodehispano.com/2012/11/taller-node-js-socket-io-con-nacho-soto-nodejs/</link>
		<comments>http://www.nodehispano.com/2012/11/taller-node-js-socket-io-con-nacho-soto-nodejs/#comments</comments>
		<pubDate>Sat, 17 Nov 2012 04:27:50 +0000</pubDate>
		<dc:creator>carlosro_ec</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Node.js]]></category>
		<category><![CDATA[Socket.IO]]></category>
		<category><![CDATA[Taller]]></category>
		<category><![CDATA[Video]]></category>

		<guid isPermaLink="false">http://www.nodehispano.com/?p=263</guid>
		<description><![CDATA[&#160;]]></description>
				<content:encoded><![CDATA[<p><iframe src="http://www.youtube.com/embed/E1FcQPYoZZk?feature=player_detailpage" frameborder="0" width="640" height="360"></iframe></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nodehispano.com/2012/11/taller-node-js-socket-io-con-nacho-soto-nodejs/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Oferta Laboral &#8211; Node.js en Mediasmart</title>
		<link>http://www.nodehispano.com/2012/11/oferta-laboral-node-js-en-mediasmart/</link>
		<comments>http://www.nodehispano.com/2012/11/oferta-laboral-node-js-en-mediasmart/#comments</comments>
		<pubDate>Thu, 15 Nov 2012 16:45:56 +0000</pubDate>
		<dc:creator>carlosro_ec</dc:creator>
				<category><![CDATA[Oferta Laboral]]></category>
		<category><![CDATA[Node.js]]></category>

		<guid isPermaLink="false">http://www.nodehispano.com/?p=251</guid>
		<description><![CDATA[Mediasmart es una empresa joven que soluciona problemas complejos de publicidad móvil. Es una compañía pequeña con grandes oportunidades de crecimiento. Empresa con gran respaldo y un gran lugar para trabajar con ventajas como el teletrabajo, con grandes profesionales y &#8230; <a href="http://www.nodehispano.com/2012/11/oferta-laboral-node-js-en-mediasmart/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://www.nodehispano.com/wp-content/uploads/mediasmart.gif"><img class="aligncenter size-full wp-image-255" title="mediasmart" src="http://www.nodehispano.com/wp-content/uploads/mediasmart.gif" alt="mediasmart" width="328" height="82" /></a></p>
<p style="text-align: justify;"><strong><a href="http://www.mediasmart.es/">Mediasmart</a></strong> es una empresa joven que soluciona problemas complejos de publicidad móvil. Es una compañía pequeña con grandes oportunidades de crecimiento. Empresa con gran respaldo y un gran lugar para trabajar con ventajas como el teletrabajo, con grandes profesionales y herramientas de vanguardia.<br />
Mediasmart busca candidatos para ampliar su departamento de tecnología.  Las responsabilidades serán trabajar en nuestros productos manteniendo y expandiendo sus funcionalidades, mejorando su usabilidad a través de casos de prueba y, dependiendo de tus habilidades trabajar en nuestro SDK móvil o mejorar nuestra interfaz backbone.js</p>
<p style="text-align: justify;"><strong>Capacidades</strong></p>
<p style="text-align: justify;">Mediasmart busca profesionales con experiencia en sistemas distribuidos basados en event model programming. Experiencia en Ruby EventMachine, Python Twisted/Tornado o Erlang. Lo ideal es contar con experiencia en <strong>Node.js</strong>. Si no tienes experiencia en ninguno de estos, como mínimo deberás tener experiencia en start ups, y disposición para programación creativa con contribuciones a la escena del &#8220;open source&#8221;.</p>
<ul style="text-align: justify;">
<li>Experiencia en JavaScript, de manera ideal Node.js. Coffescript es un extra</li>
<li>Experiencia en Event Driven Programming</li>
<li>Conocimiento en NoSQL. Conocimientos de administración, Membase o Couchbase es un extra</li>
<li>Conocimiento del protocolo y programación en Memcached</li>
<li>Experiencia en nginx para utilización y configuración. Experiencia en programacia de módulos en Lua para nginx es un extra</li>
<li>Experiencia de desarrollo de software en Objective C para iOS es un extra</li>
<li>Conocimiento practico de ambientes de desarrollo para Android. Contar con una aplicación escrita para Android es un extra</li>
<li>Experiencia de trabajo altamente efectivo en equipos geográficamente dispersos</li>
<li>Experiencia en el desarrollo de un Ad Server es un extra</li>
<li>Experiencia en entrega de software comercial para móviles</li>
</ul>
<p style="text-align: justify;"><strong>Otras Habilidades</strong></p>
<ul style="text-align: justify;">
<li>Excelentes habilidades de comunicación tanto escritas como orales</li>
<li>Habilidades para buena organización y habilidades para trabajo efectivo en equipos</li>
<li>Fluidez en Ingles y Español</li>
<li>Fluidez en el manejo de programas de oficina ( Word, Excel, etc… ) y sistemas operativos modernos ( Mac OS X de preferencia )</li>
</ul>
<p style="text-align: justify;"><strong>Los candidatos por favor aplicar enviando enlaces de su cuenta GitHub o proyectos personales a el correo electrónico:<em> </em></strong><a href="mailto:info@mediasmart.es">info@mediasmart.es</a></p>
<p style="text-align: justify;">Descargar oferta laboral: <a title="Mediasmart" href="http://www.nodehispano.com/wp-content/uploads/Profile-Software-Developer-v3.pdf">Link</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nodehispano.com/2012/11/oferta-laboral-node-js-en-mediasmart/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cuando los desarrolladores .NET se deciden por Node.js</title>
		<link>http://www.nodehispano.com/2012/10/cuando-los-desarrolladores-net-se-deciden-por-node-js/</link>
		<comments>http://www.nodehispano.com/2012/10/cuando-los-desarrolladores-net-se-deciden-por-node-js/#comments</comments>
		<pubDate>Tue, 16 Oct 2012 12:40:01 +0000</pubDate>
		<dc:creator>carlosro_ec</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Node]]></category>
		<category><![CDATA[Servidor]]></category>

		<guid isPermaLink="false">http://www.nodehispano.com/?p=242</guid>
		<description><![CDATA[En el sitio Performance Zone encontramos un artículo que nos llama la atención y nos presenta una comparación entre la implementación de un servidor HTTP Asíncrono desarrollado con tecnología .NET y su equivalente desarrollado con tecnología Node.js Veamos todas las herramientas necesarias &#8230; <a href="http://www.nodehispano.com/2012/10/cuando-los-desarrolladores-net-se-deciden-por-node-js/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://www.nodehispano.com/wp-content/uploads/node_js.jpeg"><img class="alignleft size-full wp-image-243" title="node_js" src="http://www.nodehispano.com/wp-content/uploads/node_js.jpeg" alt="" width="210" height="210" /></a>En el sitio <em><a href="http://architects.dzone.com/mz/high-performance">Performance Zone</a> </em>encontramos un artículo que nos llama la atención y nos presenta una comparación entre la implementación de un servidor HTTP Asíncrono desarrollado con tecnología .NET y su equivalente desarrollado con tecnología Node.js</p>
<p style="text-align: justify;">Veamos todas las herramientas necesarias aplicadas en cada implementación para cada una de estas tecnologías.</p>
<p style="text-align: justify;">Este es un pequeño ejemplo .NET de un HttpHandler con manejo asincrónico y para su ejecución se utilizó <a href="https://github.com/mikehadlow/EasyNetQ">EasyNetQ</a>.</p>
<pre class="brush: javascript; gutter: true">using System;
using System.Threading;
using System.Threading.Tasks;
using System.Web;

namespace TestHttpHandler
{
    public class TimerHandler : IHttpAsyncHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            throw new InvalidOperationException(&quot;This handler cannot be called synchronously&quot;);
        }

        public bool IsReusable
        {
            get { return false; }
        }

        public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback callback, object state)
        {
            var taskCompletionSouce = new TaskCompletionSource&lt;bool&gt;(state);
            var task = taskCompletionSouce.Task;

            var timer = new Timer(timerState =&gt;
            {
                context.Response.Write(&quot;OK&quot;);
                callback(task);
                taskCompletionSouce.SetResult(true);
            });
            timer.Change(1000, Timeout.Infinite);

            return task;
        }

        public void EndProcessRequest(IAsyncResult result)
        {
            // nothing to do
        }
    }
}</pre>
<p style="text-align: justify;">De lo que se puede ver nos lleva algún tiempo el poder desarrollar un servidor sin bloqueos lo cual es nativo en una servidor en Node.js</p>
<pre class="brush: javascript; gutter: true">var http = require(&#039;http&#039;);

http.createServer(function (req, res) {
    setTimeout(function () {
        res.writeHead(200, { &#039;Content-Type&#039;: &#039;text/plain&#039; });
        res.end(&#039;OK&#039;);
    }, 1000);
}).listen(1338);

console.log(&#039;LongRunningServer is at http://localhost:1338/&#039;);</pre>
<p style="text-align: justify;">Primero en Node.js la implementación necesita menos código y en tiempo de ejecución no es necesario de herramientas de terceros para poder ejecutarlo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nodehispano.com/2012/10/cuando-los-desarrolladores-net-se-deciden-por-node-js/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>LinkedIn migra desde Rails hacia Node #nodejs</title>
		<link>http://www.nodehispano.com/2012/10/linkedin-migra-desde-rails-hacia-node-nodejs/</link>
		<comments>http://www.nodehispano.com/2012/10/linkedin-migra-desde-rails-hacia-node-nodejs/#comments</comments>
		<pubDate>Fri, 05 Oct 2012 02:44:44 +0000</pubDate>
		<dc:creator>carlosro_ec</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[LinkedIn]]></category>
		<category><![CDATA[Migración]]></category>

		<guid isPermaLink="false">http://www.nodehispano.com/?p=234</guid>
		<description><![CDATA[LinkedIn realizó el anuncio de su migración de Ruby on Rails hacia Node.js, todo su backend fue actualizado hacia esta tecnología. Las ventajas que indican son: Mucho mejor rendimiento y reducción en la carga de la memoria, funcionando hasta 20x &#8230; <a href="http://www.nodehispano.com/2012/10/linkedin-migra-desde-rails-hacia-node-nodejs/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://www.nodehispano.com/wp-content/uploads/linkedin.jpeg"><img class="aligncenter size-full wp-image-235" title="linkedin" src="http://www.nodehispano.com/wp-content/uploads/linkedin.jpeg" alt="linkedin" width="455" height="256" /></a></p>
<p style="text-align: justify;">LinkedIn realizó el anuncio de su migración de Ruby on Rails hacia Node.js, todo su backend fue actualizado hacia esta tecnología.</p>
<p>Las ventajas que indican son:</p>
<ul>
<li>Mucho mejor rendimiento y reducción en la carga de la memoria, funcionando hasta 20x mas rápido que en otros escenarios.</li>
<li>Lo programadores pueden aprovechar sus habilidades en JavaScript</li>
<li>Los equipos de BackEnd y FrontEnd móvil pueden ser combinados en un conjunto único.</li>
<li>Se reducen de 30 a 3 servidores, dejando capacidad suficiente para 10x niveles concurrentes de utilización de recursos.</li>
<li>Los desarrolladores se pueden enfocar mas en la creación de la aplicación y no en problemas externos.</li>
</ul>
<p>Fuente: <a title="high scalability" href="http://highscalability.com/blog/2012/10/4/linkedin-moved-from-rails-to-node-27-servers-cut-and-up-to-2.html">High Scalability</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nodehispano.com/2012/10/linkedin-migra-desde-rails-hacia-node-nodejs/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Conferencia Node.JS Italia 2012</title>
		<link>http://www.nodehispano.com/2012/09/conferencia-node-js-italia-2012/</link>
		<comments>http://www.nodehispano.com/2012/09/conferencia-node-js-italia-2012/#comments</comments>
		<pubDate>Sun, 16 Sep 2012 14:09:39 +0000</pubDate>
		<dc:creator>carlosro_ec</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Conferencia]]></category>
		<category><![CDATA[Italia]]></category>
		<category><![CDATA[Node.js]]></category>

		<guid isPermaLink="false">http://www.nodehispano.com/?p=224</guid>
		<description><![CDATA[La conferencia Internacional Node.JS Italia en su segunda edición se llevará a cabo en Brescia  a partir del 10 de Noviembre. Los tickets se encuentran a la venta en el sitio web del evento http://nodejsconf.it/#secIscrizione. Además el evento incluye dos workshops &#8230; <a href="http://www.nodehispano.com/2012/09/conferencia-node-js-italia-2012/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://www.nodehispano.com/wp-content/uploads/nodejs-italy.jpeg"><img class="aligncenter size-full wp-image-225" title="nodejs italy" src="http://www.nodehispano.com/wp-content/uploads/nodejs-italy.jpeg" alt="NodeJS Italy" width="850" height="415" /></a></p>
<p style="text-align: justify;">La conferencia <a title="NodeJS IT" href="http://nodejsconf.it/"><strong>Internacional Node.JS Italia</strong></a> en su segunda edición se llevará a cabo en Brescia  a partir del <strong>10 de Noviembre</strong>. Los tickets se encuentran a la venta en el sitio web del evento <a href="http://nodejsconf.it/#secIscrizione" target="_blank">http://nodejsconf.it/#<wbr>secIscrizione</wbr></a>.</p>
<p style="text-align: justify;">Además el evento incluye dos workshops el día 9 de Noviembre uno con nivel principiante en Node.JS dictado por Golo Roden y el segundo con nivel avanzado dictado por CleanCode ( Gabriele Lana &#8211; Federico Galassi ) más info de estos talleres los pueden encontrar en <a href="http://nodejsconf.it/#secWorkshop" target="_blank">http://nodejsconf.it/#<wbr>secWorkshop</wbr></a>.</p>
<p style="text-align: justify;">Para el ciclo de conferencia aún se encuentran receptando Papers el objetivo principal es que la comunidad aporte con su experiencia en Node.JS <strong>NodeDublin</strong> ofrece 5 tickets con grandes descuentos para los participantes Italianos al participar en la conferencia.</p>
<p style="text-align: justify;">Para más info de Node.JS Brescia pueden seguir su cuenta en Twitter  <a title="Node.JS Conf IT" href="twitter.com/nodejsconfit">@nodejsconfit</a> y en Facebook <a href="https://www.facebook.com/nodejsconf" target="_blank">https://www.facebook.com/<wbr>nodejsconf</wbr></a>.</p>
<p style="text-align: justify;"><strong>NodeHispano</strong> medio oficial informará todo lo sucedido en el evento</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nodehispano.com/2012/09/conferencia-node-js-italia-2012/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducción a Socket.io #nodejs</title>
		<link>http://www.nodehispano.com/2012/09/introduccion-a-socket-io-nodejs/</link>
		<comments>http://www.nodehispano.com/2012/09/introduccion-a-socket-io-nodejs/#comments</comments>
		<pubDate>Tue, 04 Sep 2012 03:12:20 +0000</pubDate>
		<dc:creator>carlosro_ec</dc:creator>
				<category><![CDATA[Artículos]]></category>

		<guid isPermaLink="false">http://www.nodehispano.com/?p=213</guid>
		<description><![CDATA[Para seguir esta introducción necesitas tener Node.js y Express.js Antes de nada describamos socket.io Socket.io es una librería que nos permite manejar eventos en tiempo real mediante una conexión TCP y todo ello en JavaScript. Es realmente potente y podemos hacer &#8230; <a href="http://www.nodehispano.com/2012/09/introduccion-a-socket-io-nodejs/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;"><em>Para seguir esta introducción necesitas tener Node.js y Express.js</em></p>
<p style="text-align: justify;"><a href="http://www.nodehispano.com/wp-content/uploads/socket-io.jpeg"><img class="aligncenter size-full wp-image-218" title="socket-io" src="http://www.nodehispano.com/wp-content/uploads/socket-io.jpeg" alt="socket.io" width="480" height="168" /></a></p>
<p style="text-align: justify;"><strong>Antes de nada describamos socket.io</strong></p>
<p style="text-align: justify;"><a href="http://socket.io/"><em>Socket.io</em></a> es una librería que nos permite manejar eventos en tiempo real mediante una conexión TCP y todo ello en JavaScript. Es realmente potente y podemos hacer todo tipo de aplicaciones en tiempo real. Hay muchos ejemplos de chat (que puede ser lo más llamativo) por ahí. Pero yo quiero hacer algo mucho más sencillo, para que comprender su funcionamiento lleve el menor tiempo posible.</p>
<ul style="text-align: justify;">
<li><strong>Añadiendo socket.io al proyecto:</strong></li>
</ul>
<p style="text-align: justify;">Si tenemos instalado <a href="http://expressjs.com/">Express.js</a> ejecutamos el comando <code>express socketexample</code> y nos creará un directorio con un proyecto básico que podemos ejecutar entrando en el directorio <code>cd socketexample</code> y ejecutándolo <code>node app.js</code></p>
<p style="text-align: justify;">Ya tenemos nuestro proyecto express, ahora vamos a instalar Socket.io con <code>npm install socket.io</code>.</p>
<p style="text-align: justify;">Antes de importarlo en nuestro proyecto necesitamos ajustar un poco el archivo app.js que nos ha creado express para hacer que socket.io escuche en el mismo puerto que lo hace express, para eso guardamos el servidor así:</p>
<p style="text-align: justify;"><code>var server = http.createServer(app).listen(app.get('port'), function(){ console.log("Express server listening on port " + app.get('port')); });</code></p>
<p style="text-align: justify;">Y ahora sí importamos socket.io y lo iniciamos con `var io = require(‘socket.io’).listen(server);“</p>
<p style="text-align: justify;">Debe quedar así:</p>
<pre class="brush: javascript; gutter: true">/**
 * Module dependencies.
 */

var express = require(&#039;express&#039;)
  , routes = require(&#039;./routes&#039;)
  , http = require(&#039;http&#039;);

var app = express();

app.configure(function(){
  app.set(&#039;port&#039;, process.env.PORT || 3000);
  app.set(&#039;views&#039;, __dirname + &#039;/views&#039;);
  app.set(&#039;view engine&#039;, &#039;jade&#039;);
  app.use(express.favicon());
  app.use(express.logger(&#039;dev&#039;));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(__dirname + &#039;/public&#039;));
});

app.configure(&#039;development&#039;, function(){
  app.use(express.errorHandler());
});

app.get(&#039;/&#039;, routes.index);

var server = http.createServer(app).listen(app.get(&#039;port&#039;), function(){
  console.log(&quot;Express server listening on port &quot; + app.get(&#039;port&#039;));
});

var io = require(&#039;socket.io&#039;).listen(server);</pre>
<p style="text-align: justify;">Ya sí que tenemos el proyecto preparado para usar socket.io por <strong>parte del servidor.</strong></p>
<ul style="text-align: justify;">
<li><strong>Usando socket.io en el servidor y cliente.</strong></li>
</ul>
<p style="text-align: justify;">Ya tenemos socket.io en el proyecto, vamos a usarlo en el servidor y en el cliente.</p>
<p style="text-align: justify;">Para usar socket.io en el servidor debemos usar el objeto <em>io</em>. Socket.io se basa en eventos, pero para manejar estos eventos primero debemos crear una conexión entre el servidor y el cliente con el siguiente código: <code>io.sockets.on('connection', callback(socket));</code></p>
<p style="text-align: justify;">Este socket maneja la conexión cliente-servidor y nos ofrece las dos propiedades con las que vamos a trabajar, on (escucha eventos) y emit (emite eventos), aunque haya más como broadcast, set, of, volatile para temas más concretos.</p>
<p style="text-align: justify;">Empecemos:</p>
<pre class="brush: javascript; gutter: true">io.sockets.on(&#039;connection&#039;, function(socket){
  socket.emit(&#039;connected&#039;); 
  //Evento creado por nosotros se puede llamar &#039;pepito&#039;
});</pre>
<div id="gist-3556503" style="text-align: justify;">
<p>Con <code>socket.emit('connected');</code> emitimos un evento creado por nosotros, lo he llamado así porque creo que es el mejor nombre para decirle al cliente que estamos conectados.</p>
<p>Por ahora es suficiente para mostrar el mensaje de conectado.</p>
<p>Ahora, vamos a ver qué ponemos en el cliente, vamos a editar el archivo <code>layout.jade</code> para importar la librería socket.io que automáticamente sirve nuestro servidor en la ruta<code>/socket.io/socket.io.js</code> para ello la importamos en el head. Recordad que estamos usando Jade y debe hacerse así <code>script(src='/socket.io/socket.io.js')</code></p>
<p>Después vamos a usarla al final de la vista <code>index.jade</code>, puesto que vamos a tratar con ella.</p>
<p>Nuestro propósito es que aparezca un mensaje que indique que estás conectado y después, que en tiempo real, pulsando un botón emita otro evento y el servidor indique el número de eventos que se ha recibido.</p>
<p>Primero vamos a hacer la lógica de conexión y desconexión, para ello he creado los dos mensajes, ocultando el de conectado y mostrando por defecto el de desconectado.</p>
<p>Veamos como va por ahora el código en el cliente:</p>
<pre class="brush: javascript; gutter: true">extends layout

block content
  h1= title
  #disconected
    p Desconectado!
  #connected.hide
    p Conectado!
  input(type=&#039;button&#039;, value=&#039;Enviar pulsación&#039;)

  script
    //#1 Declaramos el objeto socket que se conectará en este caso a localhost
    var socket = io.connect(&#039;http://localhost&#039;);

    //#2 Función que muestra un mensaje u otro, dependiendo de la conexión.
    function toggle(){
      $(&quot;#disconected&quot;).toggleClass(&quot;hide&quot;);
      $(&quot;#connected&quot;).toggleClass(&quot;hide&quot;);
    }

    //#3 Si estamos conectados, muestra el log y cambia el mensaje
    socket.on(&#039;connected&#039;, function () {
      console.log(&#039;Conectado!&#039;);
      toggle();
    });

    //#4 Si nos desconectamos, muestra el log y cambia el mensaje.
    socket.on(&#039;disconnect&#039;, function () {
      console.log(&#039;Desconectado!&#039;);
      toggle();
      });</pre>
</div>
<pre class="brush: javascript; gutter: true">body {
  padding: 50px;
  font: 14px &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif;
}

a {
  color: #00B7FF;
}

#disconected p {
	color: red;
	background-color: rgba(200, 0, 0, 0.4);

}

#connected p {
	color: green;
	background-color: rgba(0,200,0,0.4);
}

.hide {
	display: none;
}</pre>
<ul style="text-align: justify;">
<li>#1</li>
</ul>
<p style="text-align: justify;">Una vez hemos declarado el objeto socket, con el podemos recibir eventos con<code>socket.on('evento', callback);</code> y emitirlos con <code>socket.emit('evento', data);</code></p>
<ul style="text-align: justify;">
<li>#2</li>
</ul>
<p style="text-align: justify;">Una simple función que usa jquery para mostrar u ocultar el mensaje de conectado o desconectado.</p>
<ul style="text-align: justify;">
<li>3#</li>
</ul>
<p style="text-align: justify;">Escuchamos continuamente hasta que recibamos el evento creado por nosotros en el servidor<em>server.js</em> y una vez recibido en el callback llamamos a la función creada en el punto 2 para cambiar el mensaje.</p>
<ul style="text-align: justify;">
<li>4#</li>
</ul>
<p style="text-align: justify;">Permanece escuchando hasta que se desconecte, una vez desconectado volvemos a cambiar el mensaje indicando que estamos desconectados.</p>
<p style="text-align: justify;"><em>Si ejecutas el proyecto ahora y accedes a localhost:3000, verás que el mensaje aparece en verde. Corta el servidor con Ctrl+C y verás que el mensaje ha cambiado a desconectado. Vuelve a encenderlo sin recargar la página y comprueba que vuelve a verde.</em></p>
<ul style="text-align: justify;">
<li><strong>Emitiendo eventos desde el cliente al servidor y contestar con datos</strong></li>
</ul>
<p style="text-align: justify;">Ahora vamos a poner el botón que emitirá el evento, he utilizado un simple<code>imput(type='button', value='Enviar click')#click</code> con la id click para capturar con jquery cuando se pulsa el elemento con esa id.</p>
<p style="text-align: justify;">Al pulsarlo llamamos a <code>socket.emit('click');</code> con jQuery y el servidor nos responderá con el evento <em>otherClick</em>.</p>
<p style="text-align: justify;">Mejor veamos el código del cliente y del servidor.</p>
<pre class="brush: javascript; gutter: true">/**
 * Module dependencies.
 */

var express = require(&#039;express&#039;)
  , routes = require(&#039;./routes&#039;)
  , http = require(&#039;http&#039;);

var app = express();

app.configure(function(){
  app.set(&#039;port&#039;, process.env.PORT || 3000);
  app.set(&#039;views&#039;, __dirname + &#039;/views&#039;);
  app.set(&#039;view engine&#039;, &#039;jade&#039;);
  app.use(express.favicon());
  app.use(express.logger(&#039;dev&#039;));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(__dirname + &#039;/public&#039;));
});

app.configure(&#039;development&#039;, function(){
  app.use(express.errorHandler());
});

//Declaramos una variable con el número de clicks.
var clicks = 0;

app.get(&#039;/&#039;, routes.index);

//Asignamos a server la creación del servidor http.
var server = http.createServer(app).listen(app.get(&#039;port&#039;), function(){
  console.log(&quot;Express server listening on port &quot; + app.get(&#039;port&#039;));
});

//Importamos socket.io utilizando el servidor creado anteriormente.
var io = require(&#039;socket.io&#039;).listen(server);

//Iniciamos la conexión.
io.sockets.on(&#039;connection&#039;, function(socket){
  //Emitimos nuestro evento connected
  socket.emit(&#039;connected&#039;);

  //Permanecemos a la escucha del evento click
  socket.on(&#039;click&#039;, function(){
    //Sumamos el click
    clicks++;

    //Emitimos el evento que dirá al cliente que hemos recibido el click
    //y el número de clicks que llevamos
    socket.emit(&#039;otherClick&#039;, clicks);
  });
});</pre>
<pre class="brush: javascript; gutter: true">extends layout

block content
  h1= title
  #disconected
    p Desconectado!
  #connected.hide
    p Conectado!
  h2 Has pulsado 0 veces!
  input(type=&#039;button&#039;, value=&#039;Enviar pulsación&#039;)#button

  script
    //#1 Declaramos el objeto socket que se conectará en este caso a localhost
    var socket = io.connect(&#039;http://localhost&#039;);

    //#2 Función que muestra un mensaje u otro, dependiendo de la conexión.
    function toggle(){
      $(&quot;#disconected&quot;).toggleClass(&quot;hide&quot;);
      $(&quot;#connected&quot;).toggleClass(&quot;hide&quot;);
    }

    //#3 Si estamos conectados, muestra el log y cambia el mensaje
    socket.on(&#039;connected&#039;, function () {
      console.log(&#039;Conectado!&#039;);
      toggle();
    });

    //#4 Si pulsas el botón, envía el evento click
    $(&#039;#button&#039;).click(function(){
      socket.emit(&#039;click&#039;);
      });

    //#5 El servidor nos responde al click con este evento y nos da el número de clicks en el callback.
    socket.on(&#039;otherClick&#039;, function(clicks){
      console.log(&#039;Clicks: &#039;+clicks);
      $(&#039;h2&#039;).replaceWith(&#039;&lt;h2&gt;Has pulsado &#039;+clicks+&#039; veces!&#039;);
      });

    //#6 Si nos desconectamos, muestra el log y cambia el mensaje.
    socket.on(&#039;disconnect&#039;, function () {
      console.log(&#039;Desconectado!&#039;);
      toggle();
      });</pre>
<p style="text-align: justify;">En el servidor escuchamos el evento <em>click</em>, en el callback del evento sumamos un click a la variable y emitimos que hemos recibido un click y mandamos junto al evento el número de clicks.</p>
<p style="text-align: justify;">En el cliente recibimos el evento <em>otherClick</em> y el número de clicks en el callback y los mostramos haciendo uso de jQuery.</p>
<p style="text-align: justify;">Ejecutamos el servidor y vemos el funcionamiento.</p>
<ul style="text-align: justify;">
<li><strong>Por último…</strong></li>
</ul>
<p style="text-align: justify;">Si quieres, puedes poner un log en el callback del evento <em>click</em> en el server y comprobar que al pulsar el botón en el server se imprime.</p>
<p style="text-align: justify;">Dejo el código en <a href="https://github.com/donflopez/Socket.io-Example">Github</a> del proyecto completo y os animo a que añadáis mejoras para aprender a usar Socket.io con la práctica.</p>
<h3 style="text-align: justify;">Autor de éste Artículo</h3>
<p style="text-align: justify;"><strong>Francisco López</strong> (<a href="http://twitter.com/donflopez">@donflopez</a>), webapp developer. Especializado en Node.js, Express.js, MongoDB y Socket.io. Localizable en <a href="http://github.com/donflopez">Github</a>,<a href="http://twitter.com/donflopez">Twitter</a> o en el blog donde actualmente escribe <a href="http://donflopez.tumblr.com/">Tumblr</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nodehispano.com/2012/09/introduccion-a-socket-io-nodejs/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>GitMoon herramienta social para conocer datos estadísticos de proyectos Node.js #nodejs</title>
		<link>http://www.nodehispano.com/2012/08/gitmoon-herramienta-social-para-conocer-datos-estadisticos-de-proyectos-node-js-nodejs/</link>
		<comments>http://www.nodehispano.com/2012/08/gitmoon-herramienta-social-para-conocer-datos-estadisticos-de-proyectos-node-js-nodejs/#comments</comments>
		<pubDate>Sat, 25 Aug 2012 15:11:37 +0000</pubDate>
		<dc:creator>carlosro_ec</dc:creator>
				<category><![CDATA[Recursos]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[GitMoon]]></category>

		<guid isPermaLink="false">http://www.nodehispano.com/?p=206</guid>
		<description><![CDATA[GitMoon es el complemento social para llevar datos estadisticos a partir de la información en GitHub de cada uno de los proyectos open-source de Node.js Con GitMoon podemos verificar cuantos usuarios se encuentran siguiendo determinado proyecto, con lo cual los desarrolladores &#8230; <a href="http://www.nodehispano.com/2012/08/gitmoon-herramienta-social-para-conocer-datos-estadisticos-de-proyectos-node-js-nodejs/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;"><a title="GitMoon" href="http://www.gitmoon.com/">GitMoon</a> es el complemento social para llevar datos estadisticos a partir de la información en GitHub de cada uno de los proyectos open-source de <strong>Node.js</strong></p>
<p style="text-align: justify;"><a href="http://www.nodehispano.com/wp-content/uploads/gitmoon-similar.png"><img class="aligncenter size-full wp-image-207" title="gitmoon similar" src="http://www.nodehispano.com/wp-content/uploads/gitmoon-similar.png" alt="GitMoon" width="254" height="400" /></a></p>
<p style="text-align: justify;">Con <a title="GitMoon" href="http://www.gitmoon.com/">GitMoon</a> podemos verificar cuantos usuarios se encuentran siguiendo determinado proyecto, con lo cual los desarrolladores obtienen una mayor visibilidad de su trabajo colocado en GitHub al convertirlo en un asunto social ya que además podemos interactuar entre todas las personas relacionadas al proyecto open-source de nuestro interes.</p>
<p><img class="aligncenter size-full wp-image-208" title="gitmoon traction" src="http://www.nodehispano.com/wp-content/uploads/gitmoon-traction.png" alt="GitMoon Traction" width="179" height="400" /></p>
<p>En esta primera versión <a title="GitMoon" href="http://www.gitmoon.com/">GitMoon</a> ademas utiliza la información almacenada en <strong>npm</strong> obteniendo aún mas detalles relevantes de todos los proyectos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nodehispano.com/2012/08/gitmoon-herramienta-social-para-conocer-datos-estadisticos-de-proyectos-node-js-nodejs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
