Libro para Principiantes Node Js
Libro para Principiantes Node Js
’
s'
'ceextaren nae:response -uriteliead (
response write (bod
response vend() 7
eext/atmi"}) ¢
'
function subir (response) (
console.log("Manipulador de peticiones ‘subir’ fue llamado.");
response.writetiead(200, ("Content-Type": "text/html"));
response.write("Hola Subir");
response.end()
'
exports-iniciar = iniciary
exports-subir ~ aubir;
Ahora, si esto no va a ganar los Webby Awards, entonces no
se que podria. Haciendo la peticién http://localhost:8888
/iniciar en tu browser, deberias ver un formulario muy
simple. Si no, entonces probablemente no has reiniciado la
aplicacién.
Te estoy escuchando: tener contenido de vista justo en el
manipulador de peticién es feo. Sin embargo, he decidido no
incluir ese nivel extra de abstraccién (esto es, separar la légicade vista y controlador) en este tutorial, ya que pienso que es
no nos ensefia nada que valga la pena saber en el contexto de
JavaScript o Node.js.
Mejor usemos el espacio que queda en pantalla para un
problema mas interesante, esto es, manipular la peticion
POST que dara con nuestro manipulador de peticién /subir
cuando el usuario envie este formulario.
Ahora que nos estamos convirtiendo en "novicios expertos",
ya no nos sorprende el hecho que manipular informacion de
POST este hecho de una manera no bloqueante, mediante el
uso de llamadas asincronas.
Lo que tiene sentido, ya que las peticiones POST pueden ser
potencialmente muy grandes - nada detiene al usuario de
introducir texto que tenga muchos megabytes de tamafio.Manipular este gran volumen de informacién de una vez
puede resultar en una operacion bloqueante.
Para hacer el proceso completo no bloqueante. Node.js le
entrega a nuestro cédigo la informacion POST en pequefios
trozos con callbacks que son llamadas ante determinados
eventos. Estos eventos son data (un nuevo trozo de
informacién POST ha Ilegado) y end (todos los trozos han
sido recibidos).
Necesitamos decirle a Node.js que funciones llamar de vuelta
cuando estos eventos ocurran. Esto es hecho agregando
listeners (N. del T.: del verbo listen - escuchar) al objeto de
peticién (request) que es pasado a nuestro callback onRequest
cada vez que una peticién HTTP es recibida.
Esto basicamente luce asi:request .addbistener("data", function (chunk) {
7/ fancion Lamada cuando un nuevo trozo (chunk)
7/ de informacion (data) es recibido.
he
request .addListener("end", function() (
77 fancion Mamada cuando todos los trozos (chunks)
7/ de informacion (data) han sido recibidos.
ne
La pregunta que surge es dénde implementar ésta légica.
Nosotros sdlo podemos acceder al objeto request en nuestro
servidor - no se lo estamos pasando al router o a los
manipuladores de peticién, como lo hicimos con el objeto
response.
En mi opinion, es un trabajo del servidor HTTP de darle a la
aplicacién toda la informacién de una peticién que necesite
para hacer su trabajo. Luego, sugiero que manejemos el
procesamiento de la peticion de POST en el servidor mismo ypasemos la informacién final al router y a los manipuladores
de peticion, los que luego decidiran que hacer con ésta.
Entonces, la idea es poner los callbacks data y end en el
servidor, recogiendo todo los trozos de informacién POST en
el callback data, y llamando al router una vez recibido el
evento end, mientras le entregamos los trozos de informacion
recogidos al router, el que a su vez se los pasa a los
manipuladores de peticion.
Aqui vamos, empezando con server.js:
var http = require ("http");
var url = require ("url
function iniciar(route, handle) {
function onRequest (request, response) (
var dataPosteada —
var pathname ~ url.parse (request url) .pathname;
console.log("Peticion para " + pathname + * recibida.");
xequest .setEncoding ("utt8") ;
request .addListener ("data", function (trozoPosteade) (
‘dataPosteada += trozoPosteado;console.log("Recibide trozo POST '* + trogoPosteada +"
De
request .addListener("end", function() (
route(handle, pathnane, response, dataPosteada) :
De
,
http.createserver (onReguest) -1isten (8888) ;
console. log ("Servidor Iniciade") ;
)
exports-iniciar ~ iniciar:
Basicamente hicimos tres cosas aqui: primero, definimos que
esperamos que la codificacién de la informacién recibida sea
UTF-8, agregamos un listener de eventos para el evento
"data" el cual lena paso a paso nuestra variable dataPosteada
cada vez que un nuevo trozo de informacién POST llega, y
movemos la llamada desde nuestro router al callback del
evento end de manera de asegurarnos que sélo sea llamado
cuando toda la informacién POST sea reunida. Ademas,
pasamos la informacién POST al router, ya que la vamos anecesitar en nuestros manipuladores de eventos.
Agregar un logueo de consola cada vez que un trozo es
recibido es una mala idea para cédigo de produccién
(megabytes de informacién POST, érecuerdan?, pero tiene
sentido para que veamos que pasa.
Mejoremos nuestra aplicacion. En la pagina /subir,
desplegaremos el contenido recibido. Para hacer esto posible,
necesitamos pasar la dataPosteada a los manipuladores de
peticion, en router,js.
function route (handle, pathname, response, postData) {
console.tog("A punto de rutear una peticion para " + pathname);
if (typeof handle[pathname] ~-- ‘functicn') {
handle (pathnane] (response, postData) ;
} else ¢
console.log(*No se ha encontrado manipulador para " + pathname);
response-uriteead (404, ("Content-Typa": "rext/atml"});
response.write("404 No encontrado") ;
response -end()exports route = router
Y en requestHandlers.js, incluimos la informacién de nuestro
manipulador de peticion subir:
fonction iniciar (response, postData) (
console-log("Manipulador de Feticion ‘iniciar' fue 1lamado.");
var body = ‘chtml>'+
"ehead>'+
‘"+
post >" +
cole-"60">'+
‘'+
*e/form'+
*cfbody>"+
vepnemi>'y
response-writeHead (200, {"Content-Type": “text/html"}) ;
response.write (body) 7
response.end() ;
,
function subir (response, dataPosteada) {
console-1og("Manipulador de Peticion ‘subir’ fue Lamado.");
response.writeHead (200, {"Content-Type": “text/html"});
response.write("Tu enviaste: " + dataPosteada) ;
response.end()exports-iniciar - iniciar;
exports.subir ~ subir;
Eso es, ahora somos capaces de recibir informacién POST y
usarla en nuestros manipuladores de peticién.
Una ultima cosa para este tema: lo que le estamos pasando al
router y los manipuladores de peticion es el cuerpo (body) de
nuestra peticién POST. Probablemente necesitemos consumir
los campos individuales que conforman la informacién POST,
en este caso, el valor del campo text.
Nosotros ya hemos leido acerca del médulo querystring, el
que nos ayuda con esto:
var querystring = require ("querystring") :
fonction iniciar (response, postData) {
console.1og("Nanipulador de peticion ‘inicio' fue Llamado.");
var body = ""
*ehead>! +‘emata http-equiv-"content-Type" content="caxt/html;
charset=UTE-8" />"+
*