242

INTRODUCCIÓN A NODE.JS A TRAVÉS DE KOANS · PDF fileINTRODUCCIÓN A NODE.JS A TRAVÉS DE KOANS Arturo Muñoz de la Torre Monzón (@arturomtm) Ingeniero de Teleco por la Universidad

Embed Size (px)

Citation preview

  • INTRODUCCIN A NODE.JS ATRAVS DE KOANS

    Arturo Muoz de la Torre Monzn (@arturomtm)

    Ingeniero de Teleco por la Universidad Politcnica de

    Madrid. Entusiasta de las tecnologas que dan vida a la

    Web. Curioso e imaginativo, siempre en evolucin.

  • Introduccin a Node.JS a travs de Koans

    por Arturo Muoz de la Torre Monzn

    http://nodejskoans.com

    Revisin del texto:

    D. Carlos ngel Iglesias Fernndez

    Profesor en la Escuela Tcnica Superior de Ingenieros de

    Telecomunicacin de la Universidad Politcnica de Madrid.

    El contenido de esta obra (excepto el cdigo fuente)

    est sujeto a una licencia Creative Commons Atribu-

    cin - No comercial - CompartirIgual 3.0 Unported.

    El cdigo fuente de los programas contenidos en esta obra, escritos por el

    autor exclusivamente para ella, estn todos bajo una licencia GPL.

    Koans for Node.js

    Copyright (C) 2013 Arturo Muoz de la Torre

    This program is free software: you can redistribute it and/or

    modify it under the terms of the GNU General Public License as

    published by the Free Software Foundation, either version 3 of

    the License, or any later version.

    This program is distributed in the hope that it will be useful,

    but WITHOUT ANY WARRANTY; without even the implied warranty of

    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License

    along with this program. If not, see

    .

    El diseo de la portada ha corrido a cargo del autor del libro, empleando para ello

    las tipografas: Bebas Neue, una versin modificada de la Aharoni Bold, Comfor-

    taa, Tribal Animals Tatto Design (http://tattoowoo.com/) y Entypo pictograms

    by Daniel Bruce (www.entypo.com).

    2013-05-23

    http://nodejskoans.comhttp://tattoowoo.com/www.entypo.com

  • A mis padres, Arturo y Fabi, y a

    mi hermano Edu, por su apoyo y

    confianza sin lmites.

    A Irene, porque sin ella no hubie-

    ra llegado nunca al final.

  • ndice general

    ndice general I

    ndice de Tablas V

    ndice de Figuras VII

    1. Introduccin 1

    1.1. Qu son los Koans? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

    1.2. Gua de lectura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

    1.3. Conseguir el cdigo fuente . . . . . . . . . . . . . . . . . . . . . . . . . 6

    2. Introduccin a Node v0.8 7

    2.1. Qu es Node? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

    2.2. Es una plataforma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

    2.2.1. El proceso de arranque de Node . . . . . . . . . . . . . . . . . . 9

    2.2.2. El formato CommonJS . . . . . . . . . . . . . . . . . . . . . . . 14

    2.2.3. Mdulos disponibles en el core de Node . . . . . . . . . . . . . 15

    2.2.4. Mdulos de terceras partes . . . . . . . . . . . . . . . . . . . . . 20

    2.3. Construida encima del entorno de ejecucin de JavaScript de Chro-

    me . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

    2.3.1. El lenguaje JavaScript . . . . . . . . . . . . . . . . . . . . . . . . 22

    2.3.2. El motor V8 de Google . . . . . . . . . . . . . . . . . . . . . . . . 24

    2.4. Fcil desarrollo de rpidas, escalables aplicaciones de red . . . . . 25

    2.5. Usa E/S no bloqueante dirigida por eventos . . . . . . . . . . . . . . 27

    2.5.1. El modelo de Concurrencia de Node . . . . . . . . . . . . . . . . 28

    2.5.2. Arquitectura de Node . . . . . . . . . . . . . . . . . . . . . . . . 29

    2.5.3. La clase EventEmitter . . . . . . . . . . . . . . . . . . . . . . . . 33

    2.5.4. Postponiendo la ejecucin de funciones . . . . . . . . . . . . . . 34

    2.6. Es ligero y eficiente [1] . . . . . . . . . . . . . . . . . . . . . . . . . . 35

    I

  • 2.7. Perfecto para aplicaciones en tiempo real data-intensive . . . . . . . 36

    2.7.1. Tiempo real y Node . . . . . . . . . . . . . . . . . . . . . . . . . . 36

    2.7.2. Para qu es til Node entonces? . . . . . . . . . . . . . . . . . 37

    3. Mdulos Buffer y Dgram 39

    3.1. Aspectos de UDP relevantes para Node . . . . . . . . . . . . . . . . . . 39

    3.2. UDP en Node . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

    3.3. Codificacin de caracteres . . . . . . . . . . . . . . . . . . . . . . . . . 44

    3.4. Buffers en Javascript . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

    3.5. Aplicacin con Buffers y UDP . . . . . . . . . . . . . . . . . . . . . . . 50

    3.5.1. Descripcin del problema . . . . . . . . . . . . . . . . . . . . . . 50

    3.5.2. Diseo propuesto . . . . . . . . . . . . . . . . . . . . . . . . . . 52

    3.5.2.1. El protocolo RTP . . . . . . . . . . . . . . . . . . . . . . 52

    3.5.2.2. Descripcin de la solucin . . . . . . . . . . . . . . . . 54

    3.6. Objetivos de los Koans . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

    3.7. Preparacin del entorno y ejecucin de los Koans . . . . . . . . . . . . 62

    3.8. Conclusin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

    4. Mdulos Stream y Net 65

    4.1. Aspectos de TCP relevantes para Node . . . . . . . . . . . . . . . . . . 65

    4.2. Streams en Node . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

    4.3. TCP en Node . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

    4.4. Aplicacin con Streams TCP . . . . . . . . . . . . . . . . . . . . . . . . 78

    4.4.1. Descripcin del problema . . . . . . . . . . . . . . . . . . . . . . 78

    4.4.2. Diseo propuesto . . . . . . . . . . . . . . . . . . . . . . . . . . 79

    4.5. Objetivos de los Koans . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

    4.6. Preparacin del entorno y ejecucin de los Koans . . . . . . . . . . . . 85

    4.7. Conclusin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

    5. Mdulo Http 89

    5.1. Aspectos de HTTP relevantes para Node . . . . . . . . . . . . . . . . . 89

    5.1.1. La parte del Cliente . . . . . . . . . . . . . . . . . . . . . . . . . 91

    5.1.2. La parte del Servidor . . . . . . . . . . . . . . . . . . . . . . . . . 96

    5.2. HTTP en Node . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

    5.2.1. ServerRequest . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

    5.2.2. ServerResponse . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

    5.2.3. Clientes HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106

    5.2.4. ClientResponse . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109

    II

  • 5.3. Aplicacin con HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

    5.3.1. Descripcin del problema . . . . . . . . . . . . . . . . . . . . . . 110

    5.3.2. Diseo propuesto . . . . . . . . . . . . . . . . . . . . . . . . . . 112

    5.4. Objetivos de los Koans . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

    5.5. Preparacin del entorno y ejecucin de los Koans . . . . . . . . . . . . 119

    5.6. Conclusin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119

    6. Express 121

    6.1. Connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

    6.2. Express . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

    6.2.1. Request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131

    6.2.2. Response . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

    6.3. MongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

    6.4. Aplicacin de ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

    6.4.1. Clon de Twitter, objetivo 1: autenticacin y control de sesiones 140

    6.4.1.1. Descripcin del Objetivo . . . . . . . . . . . . . . . . . . 140

    6.4.1.2. Diseo propuesto al Objetivo implementado con Ex-

    press . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

    6.4.1.3. Objetivos de los Koans . . . . . . . . . . . . . . . . . . 149

    6.4.1.4. Preparacin del entorno y ejecucin de los Koans . . . 150

    6.4.2. Clon de Twitter, objetivo 2: publicacin de whizs y follow y

    unfollow de otros usuarios . . . . . . . . . . . . . . . . . . . . . 151

    6.4.2.1. Descripcin del Objetivo . . . . . . . . . . . . . . . . . . 151

    6.4.2.2. Diseo propuesto al Objetivo implementado con Ex-

    press . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151

    6.4.2.3. Objetivos de los Koans . . . . . . . . . . . . . . . . . . 154

    6.5. Conclusin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

    7. Socket.IO 157

    7.1. Qu es Socket.IO? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

    7.1.1. Socket.IO pretende hacer posible las aplicaciones en tiempo

    real . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

    7.1.2. en cada navegador y dispositivo mvil . . . . . . . . . . . . . 158

    7.1.3. difuminando las diferencias entre los diferentes mecanismos

    de transporte . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159

    7.2. Usando Socket.IO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163

    7.2.1. Servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163

    III

  • 7.2.2. Cliente [2] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167

    7.3. Aplicacin con Socket.IO . . . . . . . . . . . . . . . . . . . . . . . . . . 176

    7.3.1. Descripcin del juego . . . . . . . . . . . . . . . . .