Title | Node js Guia Principiantes |
---|---|
Course | Estudio de trabajo |
Institution | Instituto Tecnológico de Querétaro |
Pages | 40 |
File Size | 752.9 KB |
File Type | |
Total Downloads | 25 |
Total Views | 151 |
Gkhmvgj hkbggnn kkkhff kkgfrg hjllht jjrjfu hjwkducudj kekelsj keiicuwj iwkslfjwh jwksljydjveivtskek uwkflslu jdjguwj jwkvy y Du uwj...
29/1/2015
ElLibroparaPrincipiantesenNode.js»Untutorialcompletodenode.js
ElLibroparaPrincipiantes enNode.js
UntutorialdeNode.jspor:ManuelKiessling&HermanA.Junge
SobreelTutorial El objetivo de este documento es ayudarte a empezar con el desarrollo de aplicaciones para Node.js, enseñándote todo lo que necesites saber acerca de JavaScript"avanzado"sobrelamarcha.Estetutorialvamuchomásalládeltípico manual"HolaMundo".
Status Estásleyendolaversiónfinaldeestelibro,esdecir,lasactualizacionessoloserán hechas para corregir errores o para reflejar cambiar en nuevas versiones de Node.js. Lasmuestrasdecódigodeestelibroestánprobadasparafuncionarconlaversión 0.6.11deNode.js.
AudienciaObjetivo Estedocumentoprobablementeserámejorentendidoporloslectoresquetengan un trasfondo similar al mío: Programadores experimentados en al menos un lenguaje orientadoal objeto,como Ruby, Python, PHP o Java; poca experiencia conJavaScript,yningunaexperienciaenNode.js. Elqueestedocumentoestéorientadoadesarrolladoresqueyatienenexperiencia con otros lenguajes de programación significa que no vamos a cubrir temas realmente básicos como tipos de datos, variables, estructuras de control y similares.Debessaberacercadeestostópicosparaentenderestedocumento. Sinembargo,dadoquelasfuncionesyobjetosenJavaScriptsondiferentesdesus contrapartes en la mayoría de los lenguajes, estos serán explicados con más detalle. http://www.nodebeginner.org/indexes.html
1/40
29/1/2015
ElLibroparaPrincipiantesenNode.js»Untutorialcompletodenode.js
Estructuradeestedocumento AlTérminodeestedocumento,habráscreadounaaplicaciónWebcompleta,que permitaalosusuariosdeéstaelverpáginaswebysubirarchivos. La cual, por supuesto, no va ser nada como la "aplicación que va a cambiar el mundo", no obstante eso, nosotros haremos la milla extra y no vamos sólo a codificarunaaplicaciónlo"suficientementesimple"parahacerestoscasosdeuso posible,sinoquecrearemosunframeworksencillo,perocompleto,afindepoder separarlosdistintosaspectosdenuestraaplicación.Verásloqueestosignificaen pocotiempo. EmpezaremospormirarcómoeldesarrolloenJavaScriptenNode.jsesdiferente deldesarrolloenJavaScriptenunbrowser. Luego,nosmantendremosconlaviejatradicióndeescribirunaaplicación"Hola Mundo",lacualeslaaplicaciónmásbásicadeNode.jsque"hace"algo. Enseguida, discutiremos que tipo de "aplicación del mundo real" queremos construir, disectaremos las diferentes partes que necesitan ser implementadas paraensamblarestaaplicación,yempezaremostrabajandoencadauna deestas partespasoapaso. Talycualloprometido,aprenderemossobrelamarchaacercadealgunosdelos muchos conceptos avanzados de JavaScript, como hacer uso de ellos, y ver el porqué tiene sentido el hacer uso de estos conceptos en vez de los que ya conocemosporotroslenguajesdeprogramación.
TabladeContenidos
JavaScriptyNode.js JavaScriptyTú Antesquehablemosdetodalapartetécnica,tomémonosunminutoyhablemos acerca de tiy turelación con JavaScript. Este capítulo está aquí para permitirte estimarsitienesentidoelquesigasonoleyendoestedocumento. http://www.nodebeginner.org/indexes.html
2/40
29/1/2015
ElLibroparaPrincipiantesenNode.js»Untutorialcompletodenode.js
Si eres como yo, empezaste con el "desarrollo" HTML hace bastante tiempo, escribiendo documentos HTML. Te encontraste en el camino con esta cosa simpática llamada JavaScript, pero solo la usabas en una forma muy básica, agregandointeractividadatuspáginasdecuandoencuando. Lo querealmente quisiste era"la cosareal", querías saber cómo construir sitios webcomplejosAprendisteunlenguajedeprogramacióncomoPHP,Ruby,Java, yempezasteaescribircódigo"backend". No obstante, mantuviste un ojo en JavaScript, y te diste cuenta que con la introducción de jQuery, Prototype y otros, las cosas se fueron poniendo más avanzadasenlasTierrasdeJavaScript,yqueestelenguajeerarealmentemásque hacerunwindow.open(). Sinembargo,estoeratodocosadel frontend,yaunqueeraagradablecontarcon jQuery a tu disposición en cualquier momento que te sintieras con ánimo de sazonarunapáginaweb,alfinaldeldía,loqueerasalomás, eraunusuariode JavaScript,perono,undesarrolladordeJavaScript. YentoncesllegóNode.js.JavaScriptenelservidor,¿Quéhayconeso? DecidistequeerayatiempoderevisarelnuevoJavaScript.Peroespera:Escribir aplicacionesNode.jsesuna cosa;Entenderel porqué ellasnecesitan ser escritas enlamaneraquelosonsignificaentenderJavaScript!Yestavezesenserio. Yaquíestáelproblema:YaqueJavaScriptrealmentevivedos,otalveztresvidas (ElpequeñoayudanteDHTMLdemediadosdelos90's,lascosasmásseriastales comojQueryysimilares, yahora, ellado delservidor), noes tanfácilencontrar informaciónqueteayudeaaprenderJavaScriptdela"maneracorrecta",deforma depoderescribiraplicacionesdeNode.jsenunaaparienciaquetehagasentirque nosóloestásusandoJavaScript,sinoquetambiénestándesarrollandoconél. Porqueahíestáelasunto:Yaeresundesarrollador experimentado,ynoquieres aprender una nueva técnica simplemente metiendo código aquí y allá mal aprovechándolo; Quieres estar seguro que te estás enfocando en un ángulo correcto. Hay,porsupuesto,excelentedocumentaciónafuera.Peroladocumentaciónporsí solanoessuficiente.Loquesenecesitaesunaguía. http://www.nodebeginner.org/indexes.html
3/40
29/1/2015
ElLibroparaPrincipiantesenNode.js»Untutorialcompletodenode.js
Miobjetivoesproveerteestaguía.
UnaAdvertencia HayalgunaspersonasrealmenteexcelenteenJavaScript.Nosoyunadeellas. Yosoyrealmenteeltipodelquetehehabladoenlospárrafosprevios.Séunpar de cosas acerca de desarrollar aplicaciones backend, pero aún soy nuevo al JavaScript "real" y aún más nuevo a Node.js. He aprendido solo recientemente algunodelosaspectosavanzadosdeJavaScript.Nosoyexperimentado. Porloqueestenoesunlibro"desdenoviciohastaexperto".Esteesmásbienun libro"desdenovicioanovicioavanzado". Si no fallo, entonces este será el tipo de documento que deseo hubiese tenido cuandoempecéconNode.js.
JavaScriptdelLadodelServidor LasprimerasencarnacionesdeJavaScriptvivíanenlosbrowsers.Peroestoessólo elcontexto.Defineloquepuedeshacerconellenguaje,peronodicemuchoacerca deloqueellenguaje mismopuede hacer. JavaScriptes un lenguaje"completo": Lo puedes usar en muchos contextos y alcanzar con éste, todo lo que puedes alcanzarconcualquierotrolenguaje"completo". Node.jsrealmenteessólootrocontexto:tepermitecorrercódigoJavaScriptenel backend,fueradelbrowser. Para ejecutar el código JavaScript que tu pretendes correr en el backend, este necesita ser interpretado y, bueno, ejecutado, Esto es lo que Node.js realiza, haciendousodelaMaquinaVirtualV8deGoogle,elmismoentornodeejecución paraJavaScriptqueGoogleChromeutiliza. Además,Node.jsvieneconmuchosmódulosútiles,demaneraquenotienesque escribirtododecero,comoporejemplo,algoquepongaunstringalaconsola. Entonces,Node.jsesenrealidaddoscosas:unentornodeejecuciónyunalibrería.
http://www.nodebeginner.org/indexes.html
4/40
29/1/2015
ElLibroparaPrincipiantesenNode.js»Untutorialcompletodenode.js
Para hacer uso de éstas (la librería y el entorno), necesitas instalar Node.js. En lugar de repetir el proceso aquí, te ruego visitar las instrucciones oficiales de instalación.PorfavorvuelveunavezquetengastuversióndeNode.jscorriendo.
"HolaMundo" Ok. Saltemos entonces al agua fría y escribamos nuestra primera aplicación Node.js:"HolaMundo". Abre tu editor favorito y crea un archivo llamado holamundo.js. Nosotros queremosescribir"HolaMundo"aSTDOUT,yaquíestáelcódigonecesariopara haceresto:
console.log("HolaMundo");
Grabaelarchivo,yejecútaloatravésdeNode.js:
nodeholamundo.js
EstedeberíaretornarHolaMundoentumonitor. Ok,estoesaburrido,deacuerdo?Asíqueescribamosalgunacosareal.
UnaAplicaciónWebCompletaconNode.js LoscasosdeUso Mantengámoslosimple,perorealista: ElUsuariodeberíasercapazdeocuparnuestraaplicaciónconunbrowser. ElUsuariodeberíaverunapáginadebienvenidacuandosolicita http://dominio/inicio,lacualdespliegaunformulariodesúbida. Eligiendounarchivodeimagenparasubiryenviandoelformulario,la imagendeberíasersubidaahttp://dominio/subir,dondeesdesplegadauna http://www.nodebeginner.org/indexes.html
5/40
29/1/2015
ElLibroparaPrincipiantesenNode.js»Untutorialcompletodenode.js
vezquelasúbidaestefinalizada.
Muy bien. Ahora, tu puedes ser capaz de alcanzar este objetivo googleando y programandoloquesea,peroesonoesloquequeremoshaceraquí. Másqueeso,noqueremosescribirsimplementeelcódigomásbásicoposiblepara alcanzaresteobjetivo,noimportaloeleganteycorrectoquepuedaserestecódigo. Nosotros agregaremos intencionalmente más abstracción de la necesaria de maneradepodertenerunaideadeloqueesconstruiraplicacionesmáscomplejas deNode.js.
LaPiladeAplicaciones Hagamos un desglose a nuestra aplicación. ¿Qué partes necesitan ser implementadasparapodersatisfacernuestroscasosdeuso? Queremosservirpáginasweb,demaneraquenecesitamosunServidor HTTP. Nuestroservidornecesitaráresponderdirectamentepeticiones(requests), dependiendodequéURLseapedidaenesterequerimiento,esque necesitaremosalgúntipodeenrutador(router)demanerademapearlos peticionesaloshandlers(manejadores)deéstos. Parasatisfaceralospeticionesquellegaronalservidoryhansidoruteados usandoelenrutador,necesitaremosdehechohandlers(manejadores) depeticiones ElEnrutadorprobablementedeberíatratarcualquierinformaciónPOSTque llegueydárselaaloshandlersdepeticionesenunaformaconveniente,luego necesitaremosmanipulacióndedatadepetición NosotrosnosoloqueremosmanejarpeticionesdeURLs,sinoquetambién queremosdesplegarcontenidocuandoestasURLsseanpedidas,loque significaquenecesitamosalgúntipodelógicaenlasvistasaserutilizada porloshandlersdepeticiones,demaneradepoderenviarcontenidoal browserdelUsuario. Porúltimo,peronomenosimportante,elUsuarioserácapazdesubir imágenes,asíquenecesitaremosalgúntipodemanipulacióndesubidas quienseharácargodelosdetalles.
Pensemos un momento acerca de como construiríamos esta pila deaplicaciones con PHP. No es exactamente un secreto que la configuración típica sería un ApacheHTTPserverconmod_php5instalado. http://www.nodebeginner.org/indexes.html
6/40
29/1/2015
ElLibroparaPrincipiantesenNode.js»Untutorialcompletodenode.js
Loque,asuvez,significaqueeltema"Necesitamossercapacesdeservirpáginas webyrecibirpeticionesHTTP"nisiquierasucededentrodePHPmismo. Bueno,conNode.js,lascosassonunpocodistintas.PorqueconNode.js,nosolo implementamos nuestra aplicación, nosotros también implementamos todo el servidorHTTPcompleto.Dehecho,nuestraaplicaciónwebysuservidorwebson básicamentelomismo. Esto puede sonar como mucho trabajo, pero veremos en un momento que con Node.js,noloes. Empecemosporelprincipioeimplementemoslaprimerapartedenuestrapila,el servidorHTTP..
ConstruyendolaPiladeAplicaciones UnServidorHTTPBásico CuandolleguéalpuntodondequeríaempezarconmiprimeraaplicaciónNode.js "real", me pregunté no solo como la iba a programar, sino que también, como organizarmicódigo. ¿Necesitaré tenerlo todo en un archivo? Muchos tutoriales en la Web que te enseñancómoescribirunservidorHTTPbásicoenNode.jstienentodalalógica enunsololugar.¿Quépasasiyoquieroasegurarmequemicódigosemantenga leíbleamedidaquelevayaagregandomáscosas? Resulta,queesrelativamentefácildemantenerlosdistintosaspectosdetucódigo separados,poniéndolosenmódulos. Esto te permite tener un archivo main limpio, en el cual ejecutas Node.js, y módulos limpios que pueden ser utilizados por el archivo main entre muchos otros. Así que vamos a crear un archivo main el cual usaremos para iniciar nuestra aplicación,y un archivode módulo dónderesidirá el código denuestro servidor HTTP.
http://www.nodebeginner.org/indexes.html
7/40
29/1/2015
ElLibroparaPrincipiantesenNode.js»Untutorialcompletodenode.js
Miimpresiónesqueesmásomenosunestándarnombraratuarchivoprincipal como index.js.Tienesentidotambiénquepongamosnuestromódulodeservidor enunarchivollamadoserver.js. Empecemosconelmódulodelservidor.Creaelarchivo server.jseneldirectorio raízdetuproyecto,yllénaloconelcódigosiguiente:
varhttp=require("http"); http.createServer(function(request,response){ response.writeHead(200,{"Content‐Type":"text/html"}); response.write("HolaMundo"); response.end(); }).listen(8888);
Eso es! Acabas de escribir un servidor HTTP activo. Probémoslo ejecutándoloy testeándolo.PrimeroejecutatuscriptconNode.js:
nodeserver.js
Ahora, abre tu browser y apúntalo a http://localhost:8888/. Esto debería desplegarunapáginawebquediga"HolaMundo". Interesante, ¿no? ¿Qué tal si hablamos de que está pasando aquí y dejamos la pregunta de 'cómo organizar nuestro proyecto' para después? Prometo que volveremosaesto.
AnalizandonuestroservidorHTTP Bueno,entonces,analicemosqueestápasandoaquí. Laprimeralínearequire,requierealmódulohttpquevieneincluidoconNode.jsy lohaceaccesibleatravésdelavariablehttp. Luegollamamosaunadelasfuncionesqueelmódulohttpofrece: createServer. Esta función retorna un objeto, y este objeto tiene un método llamado listen (escucha), y toma un valor numérico que indica el número de puerto en que nuestroservidorHTTPvaaescuchar. http://www.nodebeginner.org/indexes.html
8/40
29/1/2015
ElLibroparaPrincipiantesenNode.js»Untutorialcompletodenode.js
Porfavorignoraporunsegundoaladefinicióndefunciónquesiguealallavede aperturadehttp.createServer. Nosotrospodríamoshaberescritoelcódigoqueiniciaanuestroservidorylohace escucharalpuerto8888delasiguientemanera:
varhttp=require("http"); varserver=http.createServer(); server.listen(8888);
Esto hubiese iniciado al servidor HTTP en el puerto 8888 y no hubiese hecho nadamás(nisiquierarespondidoalgunapeticiónentrante). La parte realmente interesante (y rara, si tu trasfondo es en un lenguaje más conservador, como PHP) es que la definición de función está ahí mismo donde unoesperaríaelprimerparámetrodelallamadaacreateServer(). Resulta que, este definición de función ES el primer (y único)parámetro que le vamos a dar a la llamada a createServer(). Ya que en JavaScript, las funciones puedenserpasadasdeunladoaotrocomocualquierotrovalor.
PasandoFuncionesdeunLadoaOtro Puedes,porejemplo,haceralgocomoesto:
functiondecir(palabra){ console.log(palabra); } functionejecutar(algunaFuncion,valor){ algunaFuncion(valor); } ejecutar(decir,"Hola");
Leeestocuidadosamente!Loqueestamoshaciendoaquíes,nosotrospasamosla función decir() comoel primer parámetro dela función ejecutar.No el valorde retornodedecir,sinoquedecir()misma!
http://www.nodebeginner.org/indexes.html
9/40
29/1/2015
ElLibroparaPrincipiantesenNode.js»Untutorialcompletodenode.js
Entonces, decir se convierte en la variable local algunaFuncion dentro de ejecutar, y ejecutar puede llamar a la función en esta variable usando algunaFuncion()(agregandollaves). Por supuesto, dado que decir toma un parámetro, ejecutar puede pasar tal parámetrocuandollamaaalgunaFuncion. Nosotrospodemos,talcomolohicimos,pasarunafunciónporsu nombre como parámetroaotrafunción.Peronoestamosobligadosatenerquedefinirlafunción primero y luego pasarla. Podemos también definir y pasar la función como un parámetroaotrafuncióntodoalmismotiempo:
functionejecutar(algunaFuncion,valor){ algunaFuncion(valor); } ejecutar(function(palabra){console.log(palabra)},"Hola");
(N.delT.:functionesunapalabraclavedeJavaScript). Nosotrosdefinimoslafunciónquequeremospasaraejecutarjustoahíenellugar dondeejecutaresperasuprimerparámetro. De esta manera, no necesitamos darle a la función un nombre, por lo que esta funciónesllamadafunciónanónima. EstaesunaprimeraojeadaaloquemegustallamarJavaScript"avanzado".Pero tomémoslo paso a paso. Por ahora, aceptemos que en JavaScript, nosotros podemospasarunafuncióncomounparámetrocuandollamamosaotrafunción. Podemos hacer esto asignando nuestra función a una variable, la cual luego pasamos,odefiniendolafunciónapasarenelmismolugar.
DeQuémaneraelpasarfuncioneshaceque nuestroservidorHTTPfuncione Conesteconocimiento,VolvamosanuestroservidorHTTPminimalista:
varhttp=require("http"); http://www.nodebeginner.org/indexes.html
10/40
29/1/2015
ElLibroparaPrincipiantesenNode.js»Untutorialcompletodenode.js
http.createServer(function(request,response){ response.writeHead(200,{"Content‐Type":"text/html"}); response.write("HolaMundo"); response.end(); }).listen(8888);
A estas alturas, debería quedar claro lo que estamos haciendo acá: Estamos pasándolealafuncióncreateServerunafunciónanónima. Podemosllegaralomismorefactorizandonuestrocódigoasí:
varhttp=require("http"); functiononRequest(request,response){ response.writeHead(200,{"Content‐Type":"text/html"}); response.write("HolaMundo"); response.end(); } http.createServer(onRequest).listen(8888);
Quizás ahora es un buen momento para preguntar: ¿Por Qué estamos haciendo estodeestamanera?
CallbacksManejadasporEventos La respuesta a) No es algo fácil de explicar (al menos para mí), y b) Yace enla naturaleza misma de como Node.js trabaja: Está orientado al evento, esa es la razóndeporquéestanrápido. Podrías tomarte un tiempo para leer este excelente post (en inglés) de Felix Geisendördfer:Understandingnode.jsparaalgunaexplicacióndetrasfondo. AlfinaltodosereducealhechoqueNode.jstrabajaorientadoalevento.Ah,ysí, yo tampoco sé exacta...