<?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>NodeJS &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<atom:link href="https://www.oscarblancarteblog.com/category/nodejs/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.oscarblancarteblog.com</link>
	<description>Software Architect &#38; FullStack developer</description>
	<lastBuildDate>Sun, 16 Aug 2020 20:53:10 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/cropped-ob-32x32.png</url>
	<title>NodeJS &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<link>https://www.oscarblancarteblog.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">89905023</site>	<item>
		<title>Comandos útiles para NPM</title>
		<link>https://www.oscarblancarteblog.com/2018/12/29/comandos-utiles-para-npm/</link>
					<comments>https://www.oscarblancarteblog.com/2018/12/29/comandos-utiles-para-npm/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Sat, 29 Dec 2018 19:20:09 +0000</pubDate>
				<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[npm]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2647</guid>

					<description><![CDATA[Este artículo es en realidad un recuerdo para el yo del futuro que olvida rápidamente algunos de los comandos más simples, por lo que he decido crear una lista de comandos de utilidad para no olvidarlos, y si de paso, esta lista te sirve a tí, entonces creo que su objetivo podría ir más lejos [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img decoding="async" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/npm-1024x574.jpg" alt="" class="wp-image-2654"/></figure>



<p class="wp-block-paragraph">Este artículo es en realidad un recuerdo para el yo del futuro que olvida rápidamente algunos de los comandos más simples, por lo que he decido crear una lista de comandos de utilidad para no olvidarlos, y si de paso, esta lista te sirve a tí, entonces creo que su objetivo podría ir más lejos que solo ser una guia para mi mismo.</p>



<span id="more-2647"></span>



<p class="wp-block-paragraph">Esta lista empezará con pocos comandos, pero iré agregando más a medida que los recuerde. Si crees conveniente agregar algún comando a esta lista, puede dejarlo en la caja de comentarios y con gusto lo agregaremos.</p>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">Iniciar una aplicación</h2>



<ul class="wp-block-list"><li><em><strong>npm start</strong></em></li></ul>



<p class="wp-block-paragraph">Ejecuta los comando definidos en la sección&nbsp;<code>scripts.start</code> del archivo <code>package.json</code></p>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">Instalar un módulo</h2>



<ul class="wp-block-list"><li><em><strong>npm install &lt;package-name&gt;</strong></em></li></ul>



<p class="wp-block-paragraph">Instala la última versión estable del módulo nombrado en la sección <code>&lt;package-name&gt;</code></p>



<ul class="wp-block-list"><li><em><strong>npm install &lt;pakage-name&gt;@&lt;version&gt;</strong></em></li></ul>



<p class="wp-block-paragraph">Igual que el anterior, con la diferencia que el parámetro <code>version</code> nos permite indicar la versión exacta del módulo que vamos a instalar</p>



<ul class="wp-block-list"><li><em><strong>npm install -g &lt;pakage-name&gt;</strong></em></li></ul>



<p class="wp-block-paragraph">El parámetro <code>-g</code> instala el módulo de forma global, lo que hace disponible en cualquier desde cualquier ubicación o proyecto.</p>



<ul class="wp-block-list"><li><em><strong>npm install &#8211;save &lt;pakage-name&gt;</strong></em></li></ul>



<p class="wp-block-paragraph">El parámetro&nbsp;<code>--save</code>&nbsp;indica que la dependencia debe de ser grabada en la sección&nbsp;<code>dependencies</code>del archivo&nbsp;<code>package.json</code></p>



<ul class="wp-block-list"><li><em><strong>npm install -D &lt;package-name&gt;</strong></em></li></ul>



<p class="wp-block-paragraph">El parámetro <code>-D</code> le indica que la librería se debe instalar en la sección&nbsp;<code>devDependencies</code> del archivo <code>package.json</code></p>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">Desinstalar un módulo</h2>



<ul class="wp-block-list"><li><em><strong>npm uninstall &lt;package-name&gt;</strong></em></li></ul>



<p class="wp-block-paragraph">Desinstala el módulo indicado en el parámetro <code>&lt;pakage-name&gt;</code>.</p>



<ul class="wp-block-list"><li><em><strong>npm uninstall -g &lt;package-name&gt;</strong></em></li></ul>



<p class="wp-block-paragraph">Igual que el anterior, con la diferencia que el parámetro <code>-g</code> le indica que borre la dependencia de las librerías globales.</p>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">Listar módulos globales instalados</h2>



<ul class="wp-block-list"><li><em><strong>npm list -g &#8211;depth 0</strong></em></li></ul>



<p class="wp-block-paragraph">El parámetro <code>list</code> es para listar todos los módulos instalados en la carpeta actual, <code>-g</code> complementa al comando anterior, para indicar que solo muestre los paquetes globales instalados en la carpeta del usuario.</p>



<p class="wp-block-paragraph">El parámetro <code>--depth 0</code> filtra las dependencias de cada paquete en la vista de árbol.</p>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">Otros tips</h2>



<h3 class="wp-block-heading">Establecer la variable NODE_ENV</h3>



<p class="wp-block-paragraph"><strong>En Windows:</strong></p>



<ul class="wp-block-list"><li><em><strong>set NODE_ENV=&lt;env&gt;</strong></em></li></ul>



<p class="wp-block-paragraph">Las variables establecidas con <code>set</code> solo estarán disponibles durante el tiempo de vida de la sesión, al cerrar la consola se perderá el valor.</p>



<ul class="wp-block-list"><li><em><strong>setx NODE_ENV &lt;env&gt;</strong></em></li></ul>



<p class="wp-block-paragraph">El comando <code>setx</code> permite recordar la propiedad incluso si cerramos la consola o reiniciamos el servidor.</p>



<p class="wp-block-paragraph"><strong>En Linux</strong></p>



<ul class="wp-block-list"><li><em><strong>export NODE_ENV=&lt;env></strong></em></li></ul>



<p class="wp-block-paragraph">En linux solo hay que igualar el nombre de la variable con el ambiente que decaemos establecer.</p>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<hr class="wp-block-separator"/>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/12/29/comandos-utiles-para-npm/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2647</post-id>	</item>
		<item>
		<title>Implementar JSON Web Tokens con NodeJS</title>
		<link>https://www.oscarblancarteblog.com/2018/01/16/implementar-json-web-tokens-nodejs/</link>
					<comments>https://www.oscarblancarteblog.com/2018/01/16/implementar-json-web-tokens-nodejs/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Tue, 16 Jan 2018 10:00:32 +0000</pubDate>
				<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[express]]></category>
		<category><![CDATA[jwt]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2003</guid>

					<description><![CDATA[JSON Web Tokens o simplemente JTW, es una herramienta que nos permite autenticarnos con el servidor mediante Tokens de una forma simple y segura. Los Tokens son una cadena de alfanumérica, que es generada por el servidor y es enviada al cliente para autenticaciones futuras, evitando tener que enviar credenciales en cada invocación. Te recomiendo [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>				<img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-2009" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/implementando-JSON-Web-Tokens-con-NodeJS-Cuarta-parte.png" alt="implementando JSON Web Tokens con NodeJS - Cuarta parte" width="724" height="406" />JSON Web Tokens o simplemente JTW, es una herramienta que nos permite autenticarnos con el servidor mediante Tokens de una forma simple y segura. Los Tokens son una cadena de alfanumérica, que es generada por el servidor y es enviada al cliente para autenticaciones futuras, evitando tener que enviar credenciales en cada invocación.<span id="more-2003"></span></p>
<p><em>Te recomiendo que te des una venta a mi artículo <a href="https://www.oscarblancarteblog.com/2017/06/08/autenticacion-con-json-web-tokens/"><strong>Autenticación con JSON Web Tokens</strong></a>, el cual abordo toda la teoría, por si no estás familiarizado con el concepto de Tokens y la forma de trabajar.</em></p>
<p><em>Este artículo es parte de una colección de artículo en donde explico cómo <a href="https://www.oscarblancarteblog.com/2018/01/11/construir-api-rest-nodejs-primera-parte/"><strong>Construir un API REST con NodeJS</strong></a>, por lo que si estas interesado puede regresar desde el comienzo.</em></p>
<h2>Implementando JWT en un API REST</h2>
<p>Lo primero será instalar el módulo de JWT, para lo cual, ejecutaremos el comando <span class="lang:default decode:true crayon-inline">npm install &#8211;save jsonwebtoken body-parser</span> , una vez hecho esto, tendremos que implementar un servicio de autenticación tradicional, el cual reciba usuario y contraseña y nos regrese un token en caso de éxito. El servicio quedaría de la siguiente manera:</p>
<pre class="lang:js decode:true ">var jwt = require('jsonwebtoken')
var bodyParser = require('body-parser')

app.use(bodyParser.urlencoded({extended: false}))
app.use(bodyParser.json({limit:'10mb'}))

app.post('/login', (req, res) =&gt; {
  var username = req.body.user
  var password = req.body.password

  if( !(username === 'oscar' &amp;&amp; password === '1234')){
    res.status(401).send({
      error: 'usuario o contraseña inválidos'
    })
    return
  }

  var tokenData = {
    username: username
    // ANY DATA
  }

  var token = jwt.sign(tokenData, 'Secret Password', {
     expiresIn: 60 * 60 * 24 // expires in 24 hours
  })

  res.send({
    token
  })
})</pre>
<p>La función login recibe como parámetro el usuario (<span class="lang:default decode:true crayon-inline ">req.body.user</span> ) y el password (<span class="lang:default decode:true crayon-inline ">req.body.password</span> ), los cuales los tendremos que validar contra nuestros usuarios, sin embargo, en este caso, para hacerlo más simple, lo hemos validado contra el usuario oscar/1234, si la autenticación falla, entonces regresamos un error al cliente. Por otra parte, si todo sale bien, creamos un token al usuario, el cual tiene una vigencia de 24 horas, para finalmente retornarlo.</p>
<p>Veamos un ejemplo de autenticación:</p>
<p><img decoding="async" class="aligncenter size-full wp-image-2004" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/Creando-el-Token-JWS.png" alt="Creando el Token JWS" width="938" height="762" /></p>
<p>En la imagen pasada hemos enviado las credenciales correctas para que nos genere un token, sin embargo, no se puede ver correctamente debido a su longitud, es por ello que lo ponemos por a continuación:</p>
<pre class="lang:js decode:true">{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Im9zY2FyIiwiaWF0IjoxNTE2MDY4OTI4LCJleHAiOjE1MTYxNTUzMjh9.zucLW085AiZ8VWojwNFFcMz0yv1H4RbeCMQy7lVjS7s"
}</pre>
<p>Este token deberá ser guardado por el usuario para futuras invocaciones al API.</p>
<h2>Autenticándonos mediante Tokens</h2>
<p>El siguiente paso será crear un servicio protegido que valida la existencia del token, de lo contrario, evitará el acceso, para ello crearemos un servicio de prueba llamado secure:</p>
<pre class="lang:js decode:true">app.get('/secure', (req, res) =&gt; {
    var token = req.headers['authorization']
    if(!token){
        res.status(401).send({
          error: "Es necesario el token de autenticación"
        })
        return
    }

    token = token.replace('Bearer ', '')

    jwt.verify(token, 'Secret Password', function(err, user) {
      if (err) {
        res.status(401).send({
          error: 'Token inválido'
        })
      } else {
        res.send({
          message: 'Awwwww yeah!!!!'
        })
      }
    })
})</pre>
<p>Como podemos observar, lo primero que tenemos que hacer, es recuperar el header correspondiente al token, es decir, el token “<span class="lang:default decode:true crayon-inline ">authorization</span> ”, si este header no se encuentra, entonces retornamos un código 401 (No autorizado) y regresamos el motivo del error.</p>
<p>El siguiente paso es algo confuso, pues al token hay que retirarla el substring “<span class="lang:default decode:true crayon-inline ">Baerer </span> “, este String es parte de las especificaciones de HTTP, y es agredo de forma automática, por lo que no entraremos en detalles, simplemente lo retiramos.</p>
<p>Finalmente, validamos el token mediante el método verify, el cual validará que el token sea válido y además que no esté caducado, en cualquiera de estos dos casos, un error 401 es retornado junto con el mensaje de error. Finalmente, si todo sale bien, procedemos con la operación de negocio.</p>
<p>El siguiente request es enviado son el header, retornando un error 401 y su mensaje de error correspondiente:</p>
<p><img decoding="async" class="aligncenter size-full wp-image-2005" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/Validacion-fallida-del-token-JWT.png" alt="Validacion fallida del token JWT" width="926" height="651" /></p>
<p>Este nuevo request es enviado con el header ‘<span class="lang:default decode:true crayon-inline ">authorization</span> ’ el cual corresponde a un token válido generado por el servicio de login:<img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2006" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/Validacion-exitosa-del-token-JWT.png" alt="" width="926" height="661" /></p>
<p>NOTA: Siempre será mejor usar un middleware para validar el token, de esta forma, evitamos tener que validar el token en cada invocación, sin embargo, lo hemos hecho así para hacer más fácil el ejemplo.		</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/01/16/implementar-json-web-tokens-nodejs/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2003</post-id>	</item>
		<item>
		<title>Construir un API REST con NodeJS (Tercera parte)</title>
		<link>https://www.oscarblancarteblog.com/2018/01/15/construir-api-rest-nodejs-tercera-parte/</link>
					<comments>https://www.oscarblancarteblog.com/2018/01/15/construir-api-rest-nodejs-tercera-parte/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Mon, 15 Jan 2018 10:00:42 +0000</pubDate>
				<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[API REST]]></category>
		<category><![CDATA[express]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=1989</guid>

					<description><![CDATA[Este artículo es la tercera parte del articulo original (Segunda parte), en la cual hablamos de los HTTP Verbs, su importancia, funcionalidad y cómo implementarla en nuestro API utilizando NodeJS + Express. En esta tercera parte, hablaremos acerca de los URL paths, cómo es posible crear URL parametrizadas y la forma de recuperar los parámetros [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>				<img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1991" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/banner.png" alt="Construir un API REST con NodeJS - Tercera parte" width="723" height="404" />Este artículo es la tercera parte del articulo original (<a href="https://www.oscarblancarteblog.com/2018/01/12/construir-api-rest-nodejs-segunda-parte/">Segunda parte</a>), en la cual hablamos de los HTTP Verbs, su importancia, funcionalidad y cómo implementarla en nuestro API utilizando <a href="https://www.oscarblancarteblog.com/2017/05/29/introduccion-a-nodejs-2/">NodeJS</a> + Express. En esta tercera parte, hablaremos acerca de los URL paths, cómo es posible crear URL parametrizadas y la forma de recuperar los parámetros del objeto request.<span id="more-1989"></span></p>
<h2>URL Paths</h2>
<p>Uno de los aspectos más importantes de un servicio REST, es su URL, primero que nada, porque es la <strong>forma en que podemos consumir el servicio</strong>, pero también es importante por le da al usuario una <strong>pista significativa acerca de su funcionalidad</strong>. Una URL bien definida, podría decirle al usuario para que sirve con una precisión muy acertada, sin tener que recurrir a la documentación.</p>
<p>Para que una URL tenga un significado real, es necesario complementarlo con método (o verb) al que responde, pues el método nos dice el tipo de operación que va a realizar, mientras que la URL nos dice que es lo que va hacer. Analicemos las siguientes URL:</p>
<table  class=" table table-hover" >
<tbody>
<tr>
<td width="75">GET</td>
<td width="491">/users/oscar/avatar</td>
</tr>
<tr>
<td width="75">PUT</td>
<td width="491">/users/oscar/avatar</td>
</tr>
<tr>
<td width="75">DELETE</td>
<td width="491">/users/oscar</td>
</tr>
<tr>
<td width="75">POST</td>
<td width="491">/users</td>
</tr>
</tbody>
</table>
<p>Quiero que te tomes solo un momento para analizar las URL anteriores… te aseguro que sin ser un experto pudiste adivinar con gran certeza que hace cada una de estas operaciones. Si no, te recomiendo ver la segunda parte de este artículo para refrescar un poco la memoria.</p>
<p>Como sea, vamos a explicar que hace cada una, en la primera URL, sabemos que el GET se utiliza para consultas y la URL habla de usuarios, luego un nombre y finalmente un avatar, por lo que podemos deducir que este servicio está realizando la consulta del Avatar del usuario oscar, ¿vez que fácil?</p>
<p>En la segunda URL, sabemos que PUT se utiliza para realizar updates, por lo tanto, le estamos diciendo que actualice el Avatar del usuario oscar.</p>
<p>En la tercera URL, sabemos que DELETE se utiliza para borrar un registro, por lo que está de más decir que lo que hace es borrar el usuario oscar.</p>
<p>En la cuarta URL, sabemos que POST se utiliza para crear un nuevo registro y está invocando solamente <em>/users</em>, esto me dice que el servicio está creando un nuevo usuario.</p>
<p>Con Express es realmente fácil implementar estas URL, tan solo hay que definir los Routers con el método adecuado y con el URL al que debe procesar, veamos cómo quedaría:</p>
<pre class="lang:js decode:true">app.get('/users/oscar/avatar', (req, res) =&gt; {
  res.send('Hello GET:/users/oscar/avatar')
})

app.put('/users/oscar/avatar', (req, res) =&gt; {
  res.send('Hello PUT:/users/oscar/avatar')
})

app.delete('/users/oscar', (req, res) =&gt; {
  res.send('Hello DELETE:/users/oscar')
})

app.post('/users', (req, res) =&gt; {
  res.send('Hello POST:/users')
})</pre>
<p>Los paths siempre deben de representar exactamente lo que hacen, y el método debe de corresponder con la acción que realizará, pues no hacerlo, puede confundir a los desarrolladores.</p>
<h2>Prioridad de los paths</h2>
<p>Un error al momento de iniciar con Express es pensar que el orden en que se definen los Routers es irrelevante, como si de una función se tratara, la cual puede ser llamada desde donde sea y siempre se ejecuta la correcta, sin embargo, esto no es cierto. Por este motivo, Express evaluar los Router en el orden en que están definidos.</p>
<p>Existe ocasiones en que más de una URL puede colisionar y entrar en el Path equivocado, por ejemplo, las siguientes dos URL:</p>
<p><span class="lang:default decode:true crayon-inline">GET: /*</span></p>
<p><span class="lang:default decode:true crayon-inline ">GET:/login</span></p>
<p>La primera acepta cualquier URL, porque tiene un comodín (*), mientras que la segunda, solo acepta la URL <em>/login</em>. En este caso, como <em>/*</em> esta primero, entonces atenderá las peticiones que lleguen a <em>/login</em>, porque el path <em>/*</em> cumple con el patrón, en tal caso, tendríamos que invertir el orden de los Routers de la siguiente manera:</p>
<p><span class="lang:default decode:true crayon-inline ">GET:/login </span></p>
<p><span class="lang:default decode:true crayon-inline ">GET: /* </span></p>
<p>De esta forma, cuando llegue una petición a <em>/login</em>, la tomará el primer Router y para todos los demás path será <em>/*</em> quien procese la solicitud.</p>
<h2>URL Params</h2>
<p>Una de las características de REST, es la posibilidad de convertir ciertas partes de una URL en parámetro, de tal forma que nos ahorra tener que escribir una URL para cada registro que necesitemos.</p>
<p>Regresando al ejemplo de los servicios para usuarios GET: <em>/users/oscar</em>, podemos apreciar que “oscar” esta fija en la URL, lo que provocaría que tuviéramos que tener un Router para cada usuario registrado. Por suerte, Express nos permite escribir URL Params. Para convertir una sección de la URL en URL param, solo tendremos que anteponer dos puntos (:) antes, por ejemplo:</p>
<p><span class="lang:default decode:true crayon-inline ">/users/:username </span></p>
<p><span class="lang:default decode:true crayon-inline ">/users/:username/:field </span></p>
<p>En la primera URL podríamos recibir consultas para todos los usuarios, por ejemplo:</p>
<p><span class="lang:default decode:true crayon-inline ">/users/oscar</span> , <span class="lang:default decode:true crayon-inline ">/users/juan</span> , <span class="lang:default decode:true crayon-inline ">/users/pedro</span></p>
<p>Mientras que en la segunda URL podríamos consultar cualquier campo del usuario, por ejemplo:</p>
<p><span class="lang:default decode:true crayon-inline ">/users/oscar/avatar</span>  o <span class="lang:default decode:true crayon-inline ">/users/juan/banner</span></p>
<p>Para recuperar los URL Params, tan solo es necesario recuperarlos del objeto request de la siguiente manera: <em>req.params.&lt;name&gt;</em>. Veamos algunos ejemplos:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1993" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/API-REST-url-params.png" alt="API REST - URL Params" width="921" height="220" /></p>
<h2></h2>
<h2>Query params</h2>
<p>Los query params son lo más conocidas, y son todos aquellos que van al final de la URL seguido del símbolo de interrogación (?). Se pueden enviar cuantos Query params se requiere, siempre y cuando no excedamos el límite máximo de caracteres para un URL. Cada parámetro deberá está separado un el símbolo de ampersand (&amp;). Algunos ejemplos:</p>
<p><span class="lang:default decode:true crayon-inline ">/cources?coupon=FREE&amp;Source=Google</span></p>
<p>Este tipo de parámetros es muy común en campañas publicitarias, pues el param coupon determina que el curso a comprar es gratis (free), mientras que el param Source nos dice de donde llego el cliente (google).</p>
<p>Para recuperar un Query param en Express se usa la siguiente sentencia, <em>req.query.&lt;parama-name&gt;</em>. Veamos cómo implementarlo en Express.</p>
<pre class="lang:js decode:true ">app.get('/cources', (req, res) =&gt; {
  var coupon = req.query.coupon
  var source = req.query.source
  res.send("Coupo: " + coupon + ", Source: " + source)
})</pre>
<p>Si ejecutamos la URL <em>/cources?coupon=FREE&amp;Source=Google</em>  obtendremos el siguiente resultado:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1994" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/query-params.png" alt="API REST - query params" width="733" height="293" /></p>
<p><figure id="attachment_2293" aria-describedby="caption-attachment-2293" style="width: 648px" class="wp-caption aligncenter"><a href="https://reactiveprogramming.io/books/applicaciones-reactivas-con-react-nodejs-mongodb" target="_blank" rel="noopener"><img loading="lazy" decoding="async" class="wp-image-2293 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/11/react-banner-1024x394.jpg" alt="" width="648" height="249" /></a><figcaption id="caption-attachment-2293" class="wp-caption-text">¿Te gustaría aprender las técnicas más avanzadas para crear API REST con NodeJS? Te invito a que veas mi libro “Aplicaciones reactivas con React, NodeJS &amp; MongoDB”, donde aprenderás a crear una API REST completo, desde exponer los servicios hasta habilitar la seguridad con JSON Web Token (JTW)</figcaption></figure></p>
<h2>Body params</h2>
<p>El tercer y último tipo de parámetro que podemos enviarle a un servicio REST, es el payload (o body), el cual puede ser un mensaje largo que no se puede ver a simple vista. No todos los métodos HTTP soportan el envío de un payload, por lo que hay que tener eso en cuenta.</p>
<p>De los métodos más utilizados que soportan el envío de un payload son: POST, PUT, PATCH, DELETE. Observa que el método GET no lo soporta.</p>
<p>Recuperar el body del request no está simple como parecería, pues en realidad, este parámetro es un InputStream, lo que quiere decir, que se recibe como los datos poco a poco y no todo de una. Esto nos obliga a procesar el payload a medida que va llegando. Este proceso lo podemos simplificar con ayuda del módulo body-parser, el cual instalamos en la primera parte de este artículo (<em>npm install &#8211;save body-parser</em>).</p>
<p>Mediante este módulo, es posible convertir el payload en varios formatos, pero el que nos interesa es JSON, pues es el estándar para REST. Configurarlo, solo tendremos que importarlo y agregar un middleware (los analizaremos más adelante).</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1995 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/API-REST-Body-param.png" alt="API REST - Body param" width="925" height="734" /></p>
<p>Finalmente, existe una última forma de recibir información para el API, la cual es a través de Header, sin embargo, esta parte la dejaremos para la siguiente parte, en la cual hablaremos de la autenticación mediante JSON Web Tokens (JWT).		</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/01/15/construir-api-rest-nodejs-tercera-parte/feed/</wfw:commentRss>
			<slash:comments>16</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1989</post-id>	</item>
		<item>
		<title>Construir un API REST con NodeJS (Segunda parte)</title>
		<link>https://www.oscarblancarteblog.com/2018/01/12/construir-api-rest-nodejs-segunda-parte/</link>
					<comments>https://www.oscarblancarteblog.com/2018/01/12/construir-api-rest-nodejs-segunda-parte/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Fri, 12 Jan 2018 10:00:25 +0000</pubDate>
				<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[API REST]]></category>
		<category><![CDATA[express]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=1967</guid>

					<description><![CDATA[Este artículo es la segunda parte del articulo original (Primera parte), en el cual hablamos de cómo crear un proyecto, instalar las dependencias necesarias y montar nuestro primer servidor con Express. Si no tienes experiencia en NodeJS y Express, te recomiendo que te des una vuelta a la primera del artículo. En esta segunda parte, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>				<img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1970" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/Construir-un-API-REST-con-NodeJS.png" alt="" width="724" height="405" />Este artículo es la segunda parte del articulo original (<a href="https://www.oscarblancarteblog.com/2018/01/11/construir-api-rest-nodejs-primera-parte/">Primera parte</a>), en el cual hablamos de cómo crear un proyecto, instalar las dependencias necesarias y montar nuestro primer servidor con Express. Si no tienes experiencia en <a href="https://www.oscarblancarteblog.com/2017/05/29/introduccion-a-nodejs-2/">NodeJS</a> y Express, te recomiendo que te des una vuelta a la primera del artículo. En esta segunda parte, hablaremos de los HTTP Verbs, su importancia, funcionalidad y cómo implementarla en nuestro API utilizando NodeJS + Express.<span id="more-1967"></span></p>
<blockquote><p>También puedes ver como implementar los <a href="https://www.oscarblancarteblog.com/2018/12/03/metodos-http-rest/">verbs con Java</a> en mi guía de <a href="https://www.oscarblancarteblog.com/api-rest-java-jax-rs/">implementación de un API REST con Java</a>.</p></blockquote>
<h2>Verbs</h2>
<p>Uno de los conceptos más importantes cuando trabajamos con REST, son los Verbs (o también llamados métodos), los cuales conocemos como GET, POST, DELETE, PATCH, PULL, etc. determinan la acción que deseamos hacer sobre un determinado recurso. En REST, cada método tiene un significado para el API, pues una misma URL puede tener diferente significado dependiendo sobre el método se ejecutó.</p>
<p>Por ejemplo, la URL /user/oscar sobre el método GET, representa una consulta para el API, mientras que la misma URL sobre el método DELETE, representa una instrucción de borrar al usuario.</p>
<p>Los métodos (o verbs) más utilizados en un API REST son:</p>
<ul>
<li><strong>GET</strong>: Se utiliza para realiza consultas (Select)</li>
<li><strong>POST</strong>: Se utiliza para crear nuevos registros (Insert)</li>
<li><strong>DELETE</strong>: Se utiliza para borrar un registro (Delete)</li>
<li><strong>PUT</strong>: Se utiliza para actualizar total o parcialmente un registro existente (Update)</li>
<li><strong>PATCH</strong>: Se utiliza para actualiza solo una pequeña parte de un registro existente (Update)</li>
</ul>
<p>Puedes ver la lista completa de método soportados en la siguiente en la <a href="http://expressjs.com/es/api.html#routing-methods">documentación oficial de Express</a>.</p>
<h2>Utilizando los verbs con Express</h2>
<p>En express es realmente fácil crear servicio que atienda peticiones en los diferentes métodos, ya que proporciona una función para cada uno de ellos, el cual se define de la siguiente manera:</p>
<p>express.&lt;verb&gt;(&lt;path&gt;, &lt;callback&gt;)</p>
<p>El &lt;verb&gt; representa el método HTTP soportado por express en minúscula, el &lt;path&gt; es la ruta en la cual escucha las peticiones y el &lt;callback&gt; es la función que procesará las peticiones, la cual recibe dos parámetros, el primero es un objeto que representa el request y el segundo es el objeto que representa la respuesta, por ejemplo:</p>
<pre class="lang:js decode:true " title="server.js">var express = require('express')
var http = require('http')
var app = express()

var users = ['oscar', 'juan', 'marcos']

app.get('/users', (req, res) =&gt; {
  res.send(users)
})

app.get('/', (req, res) =&gt; {
  res.status(200).send("Welcome to API REST")
})

http.createServer(app).listen(8001, () =&gt; {
  console.log('Server started at http://localhost:8001');
});</pre>
<p>Veamos las líneas 5 y 9, hemos definido dos Routers, los cuales atienden peticiones GET, sin embargo, las dos atienden en diferente path, por lo que si ejecutamos la URL <a href="http://localhost:8001/users">http://localhost:8001/users</a> tendremos un resultado diferente que ejecutar simplemente <a href="http://localhost:8001/">http://localhost:8001</a>.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1969" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/get-method.png" alt="" width="1809" height="439" /></p>
<p>Al igual que tenemos Router para procesar peticiones GET, podemos agregar otros métodos, como, por ejemplo:</p>
<pre class="lang:js decode:true">app.post('/users', (req, res) =&gt; {
  users.push('User ' + users.length)
  res.send("New user add")
})</pre>
<p>Este nuevo Router atiende peticiones POST en el path /users, y tiene como funcionalidad agregar un nuevo usuario a la lista actual de usuario y retorna un mensaje al cliente. Desde luego que este servicio no lo podemos probar desde el navegador, por lo que utilizaremos el plugin Restlet de Chrome para probarlo, el resultado es el siguiente:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1973" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/POST-test.png" alt="" width="661" height="660" /></p>
<p>De esta forma, podemos agregar tantos métodos necesitemos para nuestra API, por ejemplo:</p>
<pre class="lang:js decode:true">app.patch('/users',(req, res) =&gt; {
  res.send('PATCH method')
})

app.delete('/users',(req, res) =&gt; {
  res.send('DELETE method')
})</pre>
<p><figure id="attachment_2259" aria-describedby="caption-attachment-2259" style="width: 648px" class="wp-caption aligncenter"><a href="https://reactiveprogramming.io/books/applicaciones-reactivas-con-react-nodejs-mongodb" target="_blank" rel="noopener"><img loading="lazy" decoding="async" class="wp-image-2259 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/08/banner-react-1024x345.jpg" alt="" width="648" height="218" /></a><figcaption id="caption-attachment-2259" class="wp-caption-text">¿Te gustaría aprender las técnicas más avanzadas para crear API REST con NodeJS? Te invito a que veas mi libro &#8220;Aplicaciones reactivas con React, NodeJS &amp; MongoDB&#8221;, donde aprenderás a crear una API REST completo, desde exponer los servicios hasta habilitar la seguridad con JSON Web Token (JTW)</figcaption></figure></p>
<p>Como hemos visto hasta ahora, es posible definir una serie de Router capaces de atender en los diferentes métodos que ofrece Express, también hemos visto que es posible definir más de un Router con el mismo método para atender diferentes URL.</p>
<p>En la siguiente parte de este artículo hablaremos acerca de los paths y como parametrizarlos para atender en URL dinámicas.</p>
<p style="text-align: center;"><a class="btn btn-default" href="https://www.oscarblancarteblog.com/2018/01/15/construir-api-rest-nodejs-tercera-parte/"> Continuación (Tercera parte)<i class="fa fa-chevron-right" aria-hidden="true"></i></a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/01/12/construir-api-rest-nodejs-segunda-parte/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1967</post-id>	</item>
		<item>
		<title>Como construir un API REST con NodeJS (Primera parte)</title>
		<link>https://www.oscarblancarteblog.com/2018/01/11/construir-api-rest-nodejs-primera-parte/</link>
					<comments>https://www.oscarblancarteblog.com/2018/01/11/construir-api-rest-nodejs-primera-parte/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 11 Jan 2018 21:27:09 +0000</pubDate>
				<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[API REST]]></category>
		<category><![CDATA[express]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=1957</guid>

					<description><![CDATA[Hoy en día, es más notable la necesidad de construir API’s para nuestras aplicaciones, las cuales nos permitan integrar nuestras aplicaciones con otras aplicaciones, o simplemente, con una serie de servicio alojado en el servidor. Desde el nacimiento de SOA, han surgido varias propuestas para satisfacer la necesidad de construir servicios para nuestras aplicaciones, tal [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1986" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/1-Construir-un-API-REST-con-NodeJS-Primera-parte.png" alt="Construir un API REST con NodeJS - Primera parte" width="723" height="407" />Hoy en día, es más notable la necesidad de construir API’s para nuestras aplicaciones, las cuales nos permitan integrar nuestras aplicaciones con otras aplicaciones, o simplemente, con una serie de servicio alojado en el servidor. Desde el nacimiento de <a href="https://www.oscarblancarteblog.com/2014/07/23/que-es-service-oriented-architecture-soa/">SOA</a>, han surgido varias propuestas para satisfacer la necesidad de construir servicios para nuestras aplicaciones, tal es el caso de los servicios <a href="https://www.oscarblancarteblog.com/2017/03/06/soap-vs-rest-2/">SOAP y REST</a>, pero también han surgido nuevos conceptos como <a href="https://www.oscarblancarteblog.com/2018/06/18/backend-as-service-baas/">Backend as a Service</a> (BaaS) y nuevas tecnologías como GraphQL. Sin embargo, una de las grandes constantes de las aplicaciones más importantes, es proporcionar un API REST, debido a que se ha convertido en la forma más simple para integrar al Backend con las aplicaciones modernas basada en JavaScript, como lo es <a href="https://www.oscarblancarteblog.com/2017/05/02/introduccion-react-js/">React</a>, Angular, etc.<span id="more-1957"></span></p>
<p>Si no sabes muy bien que es un API REST, te invito a que veas mi video un Youtube donde lo explico &#8220;<a href="https://youtu.be/RbBPuMlgdUU">Qué es API REST? &#8211; 🚀Y por que es importante aprenderlo 🚀</a>&#8221;</p>
<p><iframe loading="lazy" class="youtube-player" width="648" height="365" src="https://www.youtube.com/embed/RbBPuMlgdUU?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=es-MX&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe></p>
<p>Construir un API REST es realmente simple, y más aún, si cuentas con las tecnologías adecuadas. En este sentido, <a href="https://www.oscarblancarteblog.com/2017/05/29/introduccion-a-nodejs-2/">NodeJS</a> + Express, se ha convertido en la combinación perfecta para realizar esta tarea, pues es posible construir y levantar un API REST en cuestión de segundos.</p>
<h2>Preparando el proyecto</h2>
<p>Lo primero será crear un nuevo proyecto desde el cual estaremos trabajando, para ello, crearemos una nueva carpeta en cualquier parte y nos ubicaremos en ella a por medio de la línea de comandos. Una vez allí, ejecutaremos el comando <span class="lang:default decode:true crayon-inline">npm init</span> , el cual nos solicitará algunos datos referentes al proyecto, al finalizar, nos habrá creado el archivo <span class="lang:default decode:true crayon-inline">package.json</span> y una carpeta llamada <em>node_modules</em>, la cual contiene todas las librerías estándar de NodeJS.</p>
<p>En este punto, tendremos que instalar los módulos de NPM que vamos a requerir, para ello, ejecutaremos los comandos:</p>
<ul>
<li>npm install &#8211;save express</li>
<li>npm install &#8211;save body-parser</li>
</ul>
<p><em>Express</em> es el módulo más popular para desarrollos web en NodeJS y además, es especialmente útil para la construcción de API’s, por otra parte, el Middleware <em>body-parse</em>, que anteriormente era parte de Express, nos ayudará a procesar el payload (o body) del request, el cual nos lo dejar listo y en el formato que lo necesitamos, en este caso, en JSON.</p>
<p>En este punto, tendremos un archivo <span class="lang:default decode:true crayon-inline ">package.json</span>  muy parecido al siguiente:</p>
<pre class="lang:js decode:true" title="package.json">{
  "name": "api-rest",
  "version": "1.0.0",
  "description": "Mi primer API REST",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" &amp;&amp; exit 1"
  },
  "keywords": [
    "API",
    "REST",
    "NodeJS"
  ],
  "author": "Oscar Blancarte",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.18.2",
    "express": "^4.16.2"
  }
}
</pre>
<h2>Levantando un servidor</h2>
<p>El siguiente paso será montar un servidor usando NodeJS + Express, para lo cual, tendremos que crear un nuevo archivo llamado <span class="lang:default decode:true crayon-inline ">server.js</span>  directamente sobre la raíz del proyecto, el cual se verá de la siguiente manera:</p>
<pre class="lang:js decode:true " title="server.js">var express = require('express')
var http = require('http')
var app = express()

app.get('/', (req, res) =&gt; {
  res.status(200).send("Welcome to API REST")
})

http.createServer(app).listen(8001, () =&gt; {
  console.log('Server started at http://localhost:8001');
});</pre>
<p>Con estas simples líneas, hemos creado un servidor web capaz de servir peticiones web, sobre el cual montaremos nuestra API REST. Antes de ejecutar este código, vamos a analizar qué está pasando. Lo primero que podemos apreciar, es que importamos el módulo <em>Express</em> del que ya hablamos y el módulo <em>Http</em>, el cual es parte del estándar NodeJS, por lo que hace falta instalarlo con NPM. Este segundo módulo es utiliza para crear oyentes capases de escuchar peticiones HTTP en un determinado puerto. El segundo paso será crear una instancia de Express, como podemos observar en la línea 3.</p>
<p>Una vez hechos con la instancia de Express, solo nos resta crear los <em>Routers</em>, los cuales son las reglas por medio de las cuales Express sabrá como procesar las diferentes peticiones en diferentes URL’s, para lo cual, Express proporcionar una serie de funciones para procesar los diferentes métodos que soporta HTTP, como es <em>GET</em>, <em>POST</em>, <em>DELETE</em>, <em>PUT</em>, etc. En este caso, hemos creado un router para atender las peticiones que lleguen a la raíz del servidor. Es por eso la importancia de la línea 5, la cual responderá con la frase “Welcome to API REST” al recibir una petición GET a la raíz del servidor.</p>
<p>Al igual que tenemos la función GET, tenemos todas las demás, por ejemplo, POST, DELETE, PUSH, PUT, etc. las cuales se definen de la misma forma que GET, pero solo es necesario cambiar la función con la del método HTTP deseado, por ejemplo: <em>app.post()</em>, <em>app.delete()</em>, <em>app.push()</em>,<em> app.put()</em>. Todas estas variantes, reciben dos parámetros, el primero es la URL en la cual responden y el segundo es una función (Callback) la cual será ejecutada una vez que una petición sea recibida.</p>
<p>Finalmente, y una vez que tenemos todas las reglas de routeo (<em>routers</em>), tendremos que crear un oyente para recibir las peticiones, para ello nos apoyamos del módulo <em>Http</em> como podemos ver en la línea 9. El server Http lo creamos (<em>createServer</em>) pasando como parámetro la instancia de Express para finalmente levantar el servidor con la función <em>listener</em>. Esta última, recibe el puerto en el que escucha y una callback que se ejecuta una vez levantado el server.</p>
<p><figure id="attachment_2259-2" aria-describedby="caption-attachment-2259-2" style="width: 648px" class="wp-caption aligncenter"><a href="https://reactiveprogramming.io/books/applicaciones-reactivas-con-react-nodejs-mongodb"><img loading="lazy" decoding="async" class="wp-image-2259 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/08/banner-react-1024x345.jpg" alt="" width="648" height="218" /></a><figcaption id="caption-attachment-2259-2" class="wp-caption-text">¿Te gustaría aprender las técnicas más avanzadas para crear API REST con NodeJS? Te invito a que veas mi libro &#8220;Aplicaciones reactivas con React, NodeJS &amp; MongoDB&#8221;, donde aprenderás a crear una API REST completo, desde exponer los servicios hasta habilitar la seguridad con JSON Web Token (JTW)</figcaption></figure></p>
<h2>Probando el servidor</h2>
<p>Una vez que tenemos una primera versión de nuestro servidor, solo nos queda probarla para asegurarnos de que todo funciona bien, por lo cual, regresamos la línea de comandos y ejecutamos node <span class="lang:js decode:true crayon-inline ">server.js</span> , como resultado tendremos lo siguiente:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1959 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/start-nodejs.png" alt="API REST - start nodejs" width="606" height="92" /></p>
<p>Una vez tenemos la confirmación de que nuestro server esta arriba, procedemos con probarlo con el navegador, por lo que entramos a la URL <a href="http://localhost:8001">http://localhost:8001</a> y veremos el siguiente resultado:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1960 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/test-server.png" alt="API REST - test server" width="449" height="208" /></p>
<p>Si ves esto, es porque nuestro servidor ya está listo. No es gran cosa, pero al menos ya es avance para construir nuestra API REST.</p>
<p>Ya con esto, tenemos todo preparado para iniciar con la construcción de nuestros servicios, pero esto lo dejaremos para la segunda parte de este artículo.</p>
<p style="text-align: center;"><a class="btn btn-default" href="/2018/01/12/construir-api-rest-nodejs-segunda-parte/"> Continuación (Segunda parte)<i class="fa fa-chevron-right" aria-hidden="true"></i></a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/01/11/construir-api-rest-nodejs-primera-parte/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1957</post-id>	</item>
		<item>
		<title>Autenticación con JSON Web Tokens</title>
		<link>https://www.oscarblancarteblog.com/2017/06/08/autenticacion-con-json-web-tokens/</link>
					<comments>https://www.oscarblancarteblog.com/2017/06/08/autenticacion-con-json-web-tokens/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 08 Jun 2017 10:00:51 +0000</pubDate>
				<category><![CDATA[JSON]]></category>
		<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[javascript]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=1732</guid>

					<description><![CDATA[Los JSON Web Tokens (JWT) se ha convertido rápidamente en un estándar en la autenticación de aplicaciones, pues permite de una forma simple y elegante identificarte con el servidor mediante un Token. Dicho token es generado por el servidor y es transmitido hacia el cliente, el cual deberá presentar en cada invocación para poder ser [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1738" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/06/JSON-Web-Tokens.png" alt="JSON Web Tokens" width="1379" height="847" />Los JSON Web Tokens (JWT) se ha convertido rápidamente en un estándar en la autenticación de aplicaciones, pues permite de una forma simple y elegante identificarte con el servidor mediante un Token. Dicho token es generado por el servidor y es transmitido hacia el cliente, el cual deberá presentar en cada invocación para poder ser autenticado.<span id="more-1732"></span></p>
<h2>Que es un Token</h2>
<p>Lo primero que debemos de entender, es que es un token, pues será un concepto fundamental para entender el resto del artículo.</p>
<p>Un token es una cadena alfanumérica con caracteres aparentemente aleatorios, como el siguiente:</p>
<pre class="">eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ</pre>
<p>o el siguiente:</p>
<pre class="">24353689</pre>
<p>Estas cadenas de texto, pueden no aparentar un significado, sin embargo, tiene un significado real para el servidor o institución que lo emitió, el cual puede entender y así, validar al usuario que intenta acceder a la información, e incluso, puede tener datos adicionales.</p>
<p>Te dejo un video donde explico que es un Token:</p>
<p><iframe loading="lazy" class="youtube-player" width="648" height="365" src="https://www.youtube.com/embed/CxeNGqZ_US8?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=es-MX&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe></p>
<p>Un caso simple de tokens, es el dispositivo que dan los bancos para realizar transacciones desde internet, este token te genera un valor numérico que luego tenemos que ingresar al sistema, para que de esta forma, el portal pueda asegurarse de que efectivamente somos nosotros y no un impostor.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1733" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/06/bank-token.png" alt="" width="974" height="351" /></p>
<p>En el caso de los tokens bancarios, no se almacena una información real dentro del Token, sino que simplemente es un valor generado que luego puede ser validado por el banco como un valor real generado por nuestro token. Sin embargo, con JWT podemos enviar cualquier dato del cliente dentro del token para que el servidor pueda obtener mucha más información de nosotros.</p>
<h2>Que son los JSON Web Tokens</h2>
<p>Bien, una vez que comprendemos que son los Tokens podemos decir que los JWT son un tipo de token el cual engloba una estructura, la cual puede ser desencriptada por el servidor y de esta forma, autenticarnos como usuario en la aplicación.</p>
<p>Veamos la estructura de un JWT:</p>
<p><span style="color: #ff00ff;">eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9</span>.<span style="color: #00ccff;">eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9</span>.<span style="color: #ff0000;">TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ</span></p>
<p>Observemos que la cadena está dividida en 3 secciones separadas por un punto. Estas tres secciones tienen un significado:</p>
<ol>
<li><strong>HEADER:</strong> la primera parte, corresponde a los Header, y se almacena por lo general el tipo de token y el algoritmo de encriptamiento.</li>
<li><strong>PAYLOAD:</strong> La segunda parte, contiene los datos que identifican al usuario, como puede ser su ID, nombre de usuario, etc.</li>
<li><strong>FIRMA:</strong> La tercera parte es la firma digital, la cual se genera con las secciones anteriores y sirve para validar que el contenido no haya sido alterado.</li>
</ol>
<p>Ejemplo del Header</p>
<pre class="lang:js decode:true">{
  "alg": "HS256",
  "typ": "JWT"
}</pre>
<p>Ejemplo del Payload</p>
<pre class="lang:js decode:true ">{
  "id": "1234567890",
  "name": "Oscar Blancarte",
  "rol": “admin”
}</pre>
<p>La firma por otra parte es el header y el payload en base64 y después encriptado.</p>
<p>Puedes leer más de <a href="https://jwt.io/">JWT en su página oficial</a></p>
<h2>Como se utiliza los JWT</h2>
<p>Como ya hablamos, los JWT se utilizan para autenticar a los usuarios, para ello, el usuario requiere de un login tradicional como es el usuario y password. Una vez, que el sistema de Backend valida que el usuario y contraseña son correctos, este retorna un token al usuario. Este token lo deberá guardar el cliente, pues de aquí en adelante, todas las peticiones que realice al servidor, deberá llevar el token.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1734 " src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/06/JWT-token.png" alt="JWT JSON Web Token" width="954" height="344" /></p>
<p>El token es por lo general almacenado en Cookies o en el LocalStorage del navegador, y cuando es requerido enviar un request al servidor, se recupere y se envía como header.</p>
<p>Un dato interesante del token es que no requiere que el servidor lo almacene para compararlos cuando lo envíe el cliente, pues el token por si solo puede ser auto validado, y como tiene un payload, es posible determinar de quien es el token. Veamos el siguiente payload:</p>
<pre class="lang:js decode:true ">{
  “userID”: 12345,
  “username”: “oblancarte”,
  “rol”: “admin”
}</pre>
<p>Cuando el servidor desencripte el token, podrá recuperar este payload y con ello, podrá saber que usuario es e incluso, es posible guardar datos adicionales como el rol o cualquier dato en formato JSON.</p>
<p>Otro dato interesante del token es que expira, es decir, el token solo es válido por un tiempo determinado. Por lo que el usuario deberá volverse a logear una vez que el token expire.</p>
<h2>Veamos cómo funcionaría todo el ciclo de vida de un JWT</h2>
<p>Ya hemos hablado de como JWT funciona, pero ahora entraremos a ver como es la interacción que tiene un usuario al autenticarse por medio de JWT, para lo cual veamos la siguiente imagen:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1735" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/06/JWT-lifecycle.png" alt="JWT JSON Web Token-lifecycle" width="917" height="407" /></p>
<p>Los pasos son los siguientes:</p>
<ol>
<li>El usuario requiere de una autenticación tradicional con el servidor, es decir usuario y password (o cualquier otro tipo de autenticación).</li>
<li>El servidor validará que los datos introducidos sean correctos y generará un Token.</li>
<li>El servidor enviará el token al usuario y este lo tendrá que almacenar de cualquier forma.</li>
<li>Una vez con el token, el usuario realiza una petición al servidor, enviando en el header el token previamente generado.</li>
<li>El servidor validará que el token sea correcto, desencriptandolo mediante la misma llave que utilizo para encriptarlo.</li>
<li>Si el token es correcto, entonces el servidor retornará los datos solicitados.</li>
</ol>
<p>Cabe mencionar que los puntos 4,5 y 6 se pueden repetir indeterminado número de veces hasta que el token caduque, cuando esto pase, entonces será necesario reiniciar desde el paso 1.</p>
<h2>Como implementar un JWT</h2>
<p>Existe una serie de librerías que nos permite crear un JWT, y todo dependerá del lenguaje que utilicemos. Sin embargo, quiero mostrarte como crear un JWT con <a href="https://www.oscarblancarteblog.com/2017/05/29/introduccion-a-nodejs-2/">NodeJS</a>.</p>
<p>Lo primero, es que será necesario importar el módulo <strong>jsonwebtoken:</strong></p>
<p><em>npm install –save jsonwebtoken</em></p>
<p><em> </em></p>
<h3>Generación del Token</h3>
<p>ya con la dependencia instalada podemos crear el token de la siguiente manera:</p>
<pre class="lang:js decode:true ">var jwt = require('jsonwebtoken')

function generateToken(user) {
  var u = {
   username: user.username,
   id: user.id
  }
  return token = jwt.sign(u, ‘password’, {
     expiresIn: 60 * 60 * 24 // expires in 24 hours
  })
}</pre>
<p>Lo primero que haremos será crear una función que reciba el objeto usuario o cualquier otro objeto que contenga la información requerida para la autenticación. Luego mediante el objeto usuario, creamos el objeto u, el cual solo contiene el username y el ID del usuario. Este objeto se convertirá en el payload del JWT, es decir la segunda parte del token.</p>
<p>Seguido, procedemos a crear el token mediante el módulo jwt, el cual nos proporciona el método sign que recibirá el payload y un password, este password deberá ser secreto, pues con él, podremos crear y desencriptar los tokens. Finalmente, el tercer parámetro son las opciones, aquí podremos seleccionar el algoritmo de encriptación, la fecha de expiración, etc.  En este ejemplo dejamos la configuración por default, pero agregamos que el token sea válidos solo por 24 horas.</p>
<p>Finalmente, el token es retornado al cliente.</p>
<h3>Validación del token</h3>
<p>Hasta este punto solo hemos visto la parte de la generación del Token, pero falta la segunda parte, en donde tenemos que validar que el Token que el cliente nos manda, es válido.</p>
<p>Para validar el Token podemos utilizar un Middleware de Express que valide de forma automática todas las URL que inicien con <strong>/secure</strong>. El middleware se ve de la siguiente manera:</p>
<pre class="lang:js decode:true ">router.use('/secure',function(req, res, next) {
  var token = req.headers['authorization']
  if (!token) {
    res.status(401).send({
      ok: false,
      message: 'Toket inválido'
    })
  }

  token = token.replace('Bearer ', '')

  jwt.verify(token, ‘password’, function(err, token) {
    if (err) {
      return res.status(401).send({
        ok: false,
        message: 'Toket inválido'
      });
    } else {
      req.token = token
      next()
    }
  });
});</pre>
<p>Podemos ver que en la primera llínea inicializa el middleware, luego en la segunda línea obtenemos el token del header <strong>“</strong><strong>authorization”</strong>. Si el token es Null regresamos un 401 indicando que no el cliente no tiene privilegios.</p>
<p>Los token generados por JWT se crean con la palabra “Bearer” al inicio del token, por lo que en la línea 10 quitamos esa parte del token, seguido, en la línea 12 realizamos la validación del token mediante el método verify.</p>
<p>Este método recibe el token como primer parámetro, como segundo parámetro, mandamos el password para desencriptar el token. Finalmente se envía como tercer parámetro una función Callback una vez que el token sea validado.</p>
<p>Si todo salió bien, el token estará en la variable token, en caso contrario, tendremos el error en la variable err.</p>
<h2>Conclusiones</h2>
<p>Como pudimos ver, los tokens son una magnifica forma de administrar la autenticación de los usuarios, pues permite crear de forma fácil, un mecanismo para comunicarse de forma segura entre el cliente y el servidor, además, de que permite mantener autenticado a un usuario por un tiempo determinado, evitando tener que iniciar sesión cada vez que entre a nuestra aplicación.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2017/06/08/autenticacion-con-json-web-tokens/feed/</wfw:commentRss>
			<slash:comments>70</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1732</post-id>	</item>
		<item>
		<title>Introducción a NodeJS (JavaScript del lado del Servidor)</title>
		<link>https://www.oscarblancarteblog.com/2017/05/29/introduccion-a-nodejs-2/</link>
					<comments>https://www.oscarblancarteblog.com/2017/05/29/introduccion-a-nodejs-2/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Mon, 29 May 2017 09:00:41 +0000</pubDate>
				<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=1726</guid>

					<description><![CDATA[NodeJS es sin duda una de las tecnologías que más rápido está creciendo, y que ya hoy en día es indispensable para cubrir posiciones de trabajo. NodeJS ha sido revolucionario en todos los aspectos, desde la forma de trabajar hasta que ejecuta JavaScript del lado del servidor. &#160; NodeJS es básicamente un entorno de ejecución [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>				<img loading="lazy" decoding="async" class="aligncenter wp-image-1727" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/05/introducción-a-NodeJS.jpg" alt="introducción a NodeJS" width="983" height="551" />NodeJS es sin duda una de las tecnologías que más rápido está creciendo, y que ya hoy en día es indispensable para cubrir posiciones de trabajo. NodeJS ha sido revolucionario en todos los aspectos, desde la forma de trabajar hasta que ejecuta JavaScript del lado del servidor.<span id="more-1726"></span></p>
<p>&nbsp;</p>
<p>NodeJS es básicamente un <strong>entorno de ejecución JavaScript del lado del servidor</strong>, puede sonar extraño, ¿JavaScript del lado del servidor? ¿Pero que no JavaScript se ejecuta en el navegador del lado del cliente? JavaScript nace inicialmente en la década de los noventas por los desarrolladores de Netscape, el cual fue creado para resolver problemas simples como validación de formularios, alertas y alguna que otra pequeña lógica de programación, nada complicado, sin embargo, JavaScript ha venido evolucionando hasta convertirse en un lenguaje de programación completo. NodeJS es creado por Ryan Lienhart Dahl, quien tuve la gran idea de tomar el motor de JavaScript de Google Chrome llamado V8, y montarlo como el Core de NodeJS.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1728" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/05/NodeJS-Architecture.png" alt="NodeJS Architecture" width="668" height="421" /></p>
<p>&nbsp;</p>
<p>Como puedes ver en la imagen, NodeJS es en realidad el motor de JavaScript V8 con una capa superior de librerías de NodeJS, las cuales se encargan de la comunicación entre el API de NodeJS y el Motor V8. Adicionalmente, se apoya de la librería Libuv la cual es utilizada para el procesamiento de entradas y salidas asíncronas.</p>
<p>&nbsp;</p>
<p>Cabe mencionar que NodeJS es <a href="https://es.wikipedia.org/wiki/Software_de_c%C3%B3digo_abierto">Open Source</a> y <a href="https://es.wikipedia.org/wiki/Multiplataforma">multiplataforma</a>, lo que le ha ayudado a ganar terrenos rápidamente.</p>
<p>&nbsp;</p>
<p><strong>Que es NodeJS (Según su creador):</strong></p>
<p>Node.js® es un entorno de ejecución para JavaScript construido con el <a href="https://developers.google.com/v8/">motor de JavaScript V8 de Chrome</a>. Node.js usa un modelo de operaciones E/S sin bloqueo y orientado a eventos, que lo hace liviano y eficiente. El ecosistema de paquetes de Node.js, <a href="https://www.npmjs.com/">npm</a>, es el ecosistema más grande de librerías de código abierto en el mundo.</p>
<p>&nbsp;</p>
<p>Te puede interesar mi articulo sobre <a href="https://www.oscarblancarteblog.com/2017/03/21/10-tecnologias-que-debes-de-aprender/" target="_blank" rel="noopener noreferrer">las 10 tecnologías que debes aprender</a>, en donde incluyo a NodeJS.</p>
<p>&nbsp;</p>
<h2>NodeJS un cambio de paradigma</h2>
<p>&nbsp;</p>
<p>NodeJS ha representado para muchos programadores todo un cambio de paradigma, pues tiene como principal característica, el procesamiento asíncrono en casi la totalidad de sus tareas. Para ello, NodeJS utiliza únicamente un hilo de ejecución y procesamiento de entrada y salida asíncrono. Con lo cual, NodeJS no realiza bloqueos en el procesamiento.</p>
<p>Esto quiere decir que cuando es requerido realizar una tarea secuencial, la cual requiere realizar el paso 1,2 y 3 en ese orden, es necesario crear una serie de callbacks, lo cual es básicamente que al terminar el paso 1, manda llamar una función correspondiente al paso 2, y al terminar el paso 2, manda llamar otra función correspondiente al paso 3. Esta serie de llamadas o callbacks es una de las cuestiones más criticadas de NodeJS, que incluso, ya le han puesto un nombre <a href="http://callbackhell.com/">Call Backs Hell</a> o el Infierno de las call backs, pues es necesario anidar una gran cantidad de funciones para realizar una única operación, lo cual puede ser un verdadero dolor de cabeza al intentar seguir el código, además que es muy verboso.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1729" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/05/callbacks-hell.jpg" alt="callbacks hell" width="621" height="332" /></p>
<p>&nbsp;</p>
<p>Como podemos ver en la imagen, el resultado de la ejecución de cada paso es enviado a la siguiente función (Callback) para continuar con el procesamiento.</p>
<p>&nbsp;</p>
<p>La pregunta obvia aquí es, si es tan complicado usar callback ¿porque no procesamos todo de forma síncrona?, pues la respuesta es muy simple, y es que JavaScript funciona nativamente de forma asíncrona y segunda, esta es en realidad uno de los principales diferenciadores de NodeJS, pues trabajar de esta forma ayuda a optimizar los recursos del servidor, pues no mantiene hilos bloqueantes entre la ejecución de cada paso.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>NodeJS y la arquitectura de Microservicios</h2>
<p>&nbsp;</p>
<p>Para los que no conozcan esta arquitectura, le comento que microservicios es una arquitectura que promueve el desarrollo de pequeñas aplicaciones que corran de forma independiente, en lugar de tener aplicaciones monolíticas montadas en un servidor de aplicaciones, en donde si un servidor se muere, probablemente dejen de funcionar muchas aplicaciones.</p>
<p>&nbsp;</p>
<p>NodeJS tiene la gran característica de ser extremadamente modular, esto quiere decir que existe un pequeñísimo módulo para cada característica de NodeJS, por ejemplo, existe un módulo para usar el File System, otro para parciar el body de un request http, otro para conexión base de datos. Es más, existe módulos que solo tiene una función. Esto ayuda a que las aplicaciones NodeJS corran únicamente con los módulos estrictamente necesarios y ayudan en gran parte a crear aplicaciones mucho más livianas.</p>
<p>&nbsp;</p>
<p>Dada la modularidad y simplicidad de trabajo de JavaScript, hace que NodeJS esté tomando mucho terreno en el desarrollo de aplicaciones simples, que pueden ser <a href="https://m.do.co/c/065ecb90cdbf">montados en servidores de hasta 5 USD al mes</a>, y funcione a la perfección.</p>
<p>&nbsp;</p>
<h2>NodeJS y NPM</h2>
<p>&nbsp;</p>
<p>Para los que viene de Java, NPM es el equivalente a Maven, si, aun así, no te queda claro. NPM es el gestor de paquetes (módulos) de NodeJS, mediante NPM es posible descargar de forma automática las dependencias y ejecutar instrucciones como iniciar o apagar NodeJS.</p>
<p>&nbsp;</p>
<p>NPM o Node Package Manager es en realidad mucho más complejo de lo que acabo de decir, pero lo quería resumir en pocas palabras. <a href="https://www.npmjs.com/">Puedes leer más de NPM aquí</a>.</p>
<p>&nbsp;</p>
<h2>Ventajas y desventajas de NodeJS</h2>
<p>&nbsp;</p>
<p>Hasta este momento, solo le hemos echado flores a NodeJS, pero es hora de poner las cosas en perspectiva y analizar las cosas buenas y malas que tiene, para de esta forma poder tener un mejor análisis.</p>
<p>&nbsp;</p>
<p>*Cabe mencionar que este análisis es desde mi muy humilde punto de vista, y puede que para algunos la desventaja sean ventajas y viceversa. Pero como dicen, no hay más ciego que el que no quiere ver, por lo que si tú eres un apasionado purista de NodeJS puede que nada de esto te parezca.</p>
<p>&nbsp;</p>
<h2>Ventajas</h2>
<p>&nbsp;</p>
<ul>
<li><strong>OpenSource</strong>: sin duda, hoy el software open source ha tenido la evolución más rápida y con mejor aceptación de los usuarios, además que es totalmente gratis su uso, puede descargar el código fuente para analizarlo y crear tu propio proyecto de Open Source basado en este.</li>
<li><strong>Optimización de los recursos</strong>: Dada la naturaleza asíncrona de NodeJS nos permite tener una mucho mejor administración de los recursos.</li>
<li><strong>Desarrollo agiles</strong>: NodeJS permite crear aplicaciones de una forma simple y rápida, a diferencia de otros lenguajes de programación como Java o C#, que se requiere de una gran cantidad de clases para echar a volar un proyecto.</li>
<li><strong>FullStack</strong>: Dado que JavaScript se puede ejecutar del lado del servidor y del cliente, es posible crear aplicaciones de <a href="https://www.oscarblancarteblog.com/2017/03/13/diferencias-backend-frontend-developer/">BackEnd y FrontEnd</a> con una sola tecnología.</li>
<li><strong>Modularidad</strong>: Como ya lo hablamos, NodeJS es extremadamente modular, lo cual permite utilizar únicamente los módulos requeridos sin traernos nada de más.</li>
</ul>
<p>&nbsp;</p>
<h2>Desventajas:</h2>
<p>&nbsp;</p>
<ul>
<li><strong>Tipos dinámicos:</strong> JavaScript permite enviar como parámetro un objeto que no tiene definición, solo abres y cierres llaves {} y dentro pones lo que sea, lo que hace muy complicado saber que valores puedes enviar. Si eres programador JavaScript seguramente me quedarás colgar vivo diciendo que eso es bueno.</li>
<li><strong>Callbacks: </strong>Si bien, como ya analizamos, esto hace que se utilicen mejor los recursos, la verdad es que las callbacks son un dolor de cabeza, ya que tener funciones para cada paso es incómodo y hace muy complicado seguir el código.</li>
<li><strong>Refactor: </strong>Si alguna vez has hecho un refactor importante en un proyecto de JavaScript seguro me entenderás, pues casi nunca es posible realizar uno de forma segura, pues el tipeado débil y tipos dinámicos hacen que sea complicado para el IDE determinar cómo refactorizar.</li>
<li><strong>Librerías estándar: </strong>Esta es a mi ver una de las más fuertes, es verdad que existen librerías para todos los problemas que se te puedan ocurrir, pero el problema es que existen muchas opciones para lo mismo, haciendo complicado elegir entre una u otra. Adicional que cada una avanza a un ritmo separado en vez de unir fuerzas para mejorar una versión estándar.</li>
<li><strong>Arquitectura: </strong>En mi experiencia las aplicaciones NodeJS tiene un nivel de arquitectura muy por debajo de los lenguajes de programación tradicional como Java o C# pues en NodeJS todo se basa en funciones que son enviadas y exportadas de clases. Y es raro ver que se implementan patrones arquitectónicos o patrones de diseño (desde mi experiencia).</li>
</ul>
<p>&nbsp;</p>
<h2>Conclusiones</h2>
<p>&nbsp;</p>
<p>A mi ver <strong>NodeJS es sin duda una de las tecnologías más prometedoras del futuro</strong>, dado que JavaScript se está convirtiendo en el lenguaje de programación rey. No me extrañaría que JavaScript termine desplazando a lenguajes como Java o C#, un que para esto falta tiempo.</p>
<p>Creo que empezar a apostar por NodeJS en este momento puede ser una muy buena inversión, pues cada vez empezaremos a ver más y más proyectos desarrollados con NodeJS y estas aplicaciones necesitarán de desarrolladores.		</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2017/05/29/introduccion-a-nodejs-2/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1726</post-id>	</item>
	</channel>
</rss>
