Cargando



Utilizando el objeto HTTP en Node.js

En este tutorial veremos cómo podemos utilizar el objeto HTTP de Node.js además de implementar algunas pequeñas soluciones que nos darán un poco más de entendimiento sobre la arquitectura de nuestras aplicaciones.


feb 17 2015 07:07
Profesional
feb 17 2015 11:08
El módulo HTTP dentro de nuestras aplicaciones escritas en Node.js nos ayudan a construir parte de la funcionalidad para hacer que nuestros servidores cobren vida, sin embargo este no es el uso exclusivo que le podemos dar a dicho módulo.

El verdadero poder de HTTP se ve cuando utilizamos su objeto para procesar las diferentes peticiones o request que pueden venir de nuestra aplicación, con ello podremos procesar los datos que vienen de POST a través de formularios o de peticiones de clientes REST.

Requisitos del tutorial
Para llevar a cabo los ejercicios propuestos en este tutorial debemos tener una instalación funcional de Node.js en nuestro sistema y tener permisos para acceder a la misma. Es importante también poder tener acceso a un editor de texto enriquecido para hacer la codificación de los ejemplos, podemos utilizar cualquiera con el que nos sintamos cómodos, sin embargo por su facilidad de uso recomendamos Sublime Text o NotePad ++ los cuales además tienen complementos para la sintaxis JavaScript y HTML.

Procesar datos POST


El procesamiento de datos POST nos permite adquirir datos desde formularios, con ello podemos manejar datos que provengan de interacciones de los usuarios con nuestras aplicaciones permitiéndonos así implementar lógica de negocios para tratar dichos datos.

La forma más directa que tenemos para procesar los datos POST es a través del objeto HTTP, a través de una interacción directa con el método createServer() podemos identificar el tipo de método de la petición, ya sea POST o GET e inclusive PUT y DELETE.

Si somos observadores vemos que esto nos hace pensar en nuestras aplicaciones de una forma RESTful, es decir, que podemos comunicarnos con la misma a través de diferentes clientes y no necesariamente con formularios HTML, sin embargo eso es un tema que va más allá de este tutorial.

Creando el formulario


Lo primero que haremos es crear un pequeño formulario el cual nos permitirá capturar los datos de nuestra aplicación en el navegador, para ello vamos a crear un archivo llamado formulario.html en el directorio o carpeta de nuestra aplicación.

Esto último no es lo más recomendable en un entorno de producción así que solamente lo tomaremos como referencia para poder demostrar cómo trabaja el objeto HTTP. El código de nuestro formulario será el siguiente:
<form method = "post"> <input type = "text" name = "primerCampo" > </br> <input type = "text" name = "segundoCampo" > </br> <input type = "submit" value = "Enviar" ></form>
Como podemos observar simplemente le indicamos a nuestro formulario que debe utilizar el método POST, tenemos un par de campos de texto, y por último un botón de submit para enviar al servidor nuestros datos.

Creando el servidor


Ahora debemos crear el servidor Node.js que nos va a ayudar a recopilar los datos del formulario, aquí debemos tener en cuenta dos posibilidades, la primera es cuando accedemos a la ruta de nuestra aplicación, esto va a ser utilizando el método GET y aquí es donde debemos mostrar nuestro formulario.

La segunda posibilidad es cuando se envíe los datos del formulario y para ello debemos validar el método POST que es el objetivo del ejercicio. Para que podamos mostrar el formulario hay que crear un componente síncrono que lea nuestro archivo formulario.html y lo sirva en la ruta correspondiente, para ello podemos apoyarnos en el método readFileSync del módulo fs.

En la siguiente parte debemos hacer que nuestro servidor pueda manejar los datos POST, para ello simplemente vamos a hacer que se muestre lo que recibimos en consola con el método console.log(), de esta manera podremos confirmar que todo está funcionando de manera adecuada, veamos el código inicial para lograr lo que deseamos:
var http = require('http');var querystring = require('querystring');var util = require('util');var form = require('fs').readFileSync('formulario.html');http.createServer(function (request, response) { if (request.method === "POST") { var datosPost = ''; request.on('data', function (chunk) { datosPost += chunk; }).on('end', function () { var datosPostObjeto = querystring.parse(datosPost); console.log('El usuario Envió los datos:\n', datosPost); response.end('Has enviado los datos:\n' + util.inspect(datosPostObjeto)); }); } if (request.method === "GET") { response.writeHead(200, {'Content-Type': 'text/html'}); response.end(form); }}).listen(8082);
Para que todo resulte lo más legible posible se incorporó adicionalmente los módulos querystring y util, con ellos podemos procesar la información que viene del servidor y así poder manipularla para hacer la impresión de la misma.

Veamos cómo debe lucir inicialmente nuestro formulario cuando iniciamos nuestra aplicación y abrimos el navegador en la ruta raíz del proyecto:



Vamos ahora a ingresar algunos datos en los campos de texto que vemos en nuestro formulario y hacer click en el botón enviar, esto nos va a presentar una pantalla con los datos enviados y nos va a imprimir por consola el request plain, es decir, tal cual como lo recibe nuestra aplicación:

node-utilizando-objeto-http-2.jpg

Hemos visto entonces que ha sido muy fácil poder procesar los datos del formulario, al menos para mostrarlos nuevamente.

Asegurando nuestra aplicación


A pesar que el ejemplo anterior funciona correctamente, tiene unas debilidades que si la aplicación saliera a producción tal vez nos causaría más de un dolor de cabeza, por ejemplo que pasa si nos envía más datos que lo que la memoria de nuestro servidor puede soportar, obviamente toda nuestra estructura colapsaría. Si recibimos datos de POST vacío, en el estado actual de nuestra aplicación esta fallaría y obtendríamos un error lo que haría que nuestro servicio cayera y dejará de funcionar.

Para corregir estos defectos simplemente debemos incorporar unas validaciones muy sencillas, en primer lugar vamos a incorporar una variable que nos va a ayudar a limitar los datos recibidos a un máximo de 2 MB, esto nos puede dar una pequeña seguridad que al menos con pocos usuarios no será posible que caiga el sistema. Luego vamos a evaluar que para que nuestra petición POST sea procesada el objeto HTTP que la contiene no puede estar vacío, así aseguramos que no haya fallas directas en nuestro servidor. Veamos el código anterior con las modificaciones adecuadas:
var http = require('http');var querystring = require('querystring');var util = require('util');var form = require('fs').readFileSync('formulario.html');var maxData = 2 * 1024 * 1024; http.createServer(function (request, response) { if (request.method === "POST") { var datosPost = ''; request.on('data', function (chunk) { datosPost += chunk; if (datosPost.length > maxData) { datosPost = ''; this.destroy(); response.writeHead(413); response.end('Los datos ingresados sobrepasan nuestra capacidad'); } }).on('end', function () { if (!datosPost) { response.end(); return; } var datosPostObjeto = querystring.parse(datosPost); console.log('El usuario Envió los datos:\n', datosPost); response.end('Has enviado los datos:\n' + util.inspect(datosPostObjeto)); }); } if (request.method === "GET") { response.writeHead(200, {'Content-Type': 'text/html'}); response.end(form); }}).listen(8082);
Si recibimos datos mayores a 2 MB simplemente escribimos una cabecera HTTP 413 para indicar el caso e inmediatamente destruimos los datos recibidos para no mantener la carga en nuestro servidor de forma innecesaria.

En el caso que recibamos datos vacíos desde POST, simplemente continuamos nuestra ejecución evitando que el servicio muera de forma inesperada.

Manejando subida de archivos


Otro de los usos que le podemos dar al método POST de HTTP es para poder recibir archivos, para ello debemos instalar un complemento en nuestro sistema y es el paquete formidable, para lograr este objetivo en la consola de Node.js vamos a ejecutar el siguiente código:
npm install formidable@1.x.x
Esto nos debe quedar de la siguiente forma:



node-utilizando-objeto-http-3.jpg

Acto siguiente vamos a modificar nuestro formulario.html con el siguiente código:
<form method = "post" enctype="multipart/form-data"> <input type = "file" name = "primerCampo" > </br> <input type = "file" name = "segundoCampo" > </br> <input type = "submit" value = "Enviar" ></form>
Básicamente lo que hicimos fue modificar el encabezado del formulario para que nuestro servidor sepa que va a recibir algo más que solo texto, y también cambiamos los campos de texto a archivos. Por último vamos a modificar nuestro archivo server.js y colocaremos el siguiente código:
var http = require('http');var formidable = require('formidable');var form = require('fs').readFileSync('formulario.html');http.createServer(function (request, response) { if (request.method === "POST") { var entrante = new formidable.IncomingForm(); entrante.uploadDir = 'archivos'; entrante.on('file', function (field, file) { if (!file.size) { return; } response.write(file.name + ' recibido\n'); }).on('end', function () { response.end('Todos los archivos fueron recibido'); }); entrante.parse(request); } if (request.method === "GET") { response.writeHead(200, {'Content-Type': 'text/html'}); response.end(form); }}).listen(8082);
Vemos como el módulo formidable es quien nos ayuda a procesar la subida de archivos, este los almacenará en una carpeta llamada archivos, lo cual para que funcione la carpeta destino debe tener permiso de escritura para Node.js.

Con esto último hemos finalizado nuestro tutorial, como vimos tenemos múltiples opciones con las cuales podremos procesar las peticiones POST utilizando el objeto HTTP en nuestro servidor Node.js, además de todas las ventajas que el mismo le agrega a nuestros desarrollos.

¿Te ayudó este Tutorial?


Sin comentarios, sé el primero!

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

X