Actualizado el 21 de Marzo del 2018 (Publicado el 8 de Febrero del 2018)
3.111 visualizaciones desde el 8 de Febrero del 2018
1,3 MB
242 paginas
Creado hace 10a (23/05/2013)
INTRODUCCIÓN A NODE.JS A
TRAVÉS DE KOANS
Arturo Muñoz de la Torre Monzón (@arturomtm)
Ingeniero de Teleco por la Universidad Politécnica de
Madrid. Entusiasta de las tecnologías que dan vida a la
Web. Curioso e imaginativo, siempre en evolución.
Introducción a Node.JS a través de Koans
por Arturo Muñoz de la Torre Monzón
http://nodejskoans.com
Revisión del texto:
D. Carlos Ángel Iglesias Fernández
Profesor en la Escuela Técnica Superior de Ingenieros de
Telecomunicación de la Universidad Politécnica de Madrid.
El contenido de esta obra (excepto el código fuente)
está sujeto a una licencia Creative Commons Atribu-
ción - No comercial - CompartirIgual 3.0 Unported.
El código fuente de los programas contenidos en esta obra, escritos por el
autor exclusivamente para ella, están todos bajo una licencia GPL.
Koans for Node.js
Copyright (C) 2013
Arturo Muñoz 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
<http://www.gnu.org/licenses/>.
El diseño de la portada ha corrido a cargo del autor del libro, empleando para ello
las tipografías: Bebas Neue, una versión 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
A mis padres, Arturo y Fabi, y a
mi hermano Edu, por su apoyo y
confianza sin límites.
A Irene, porque sin ella no hubie-
ra llegado nunca al final.
Índice general
Índice general
Índice de Tablas
Índice de Figuras
1. Introducción
1.1. ¿Qué son los Koans? . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2. Guía de lectura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3. Conseguir el código fuente . . . . . . . . . . . . . . . . . . . . . . . . .
I
V
VII
1
2
3
6
2. Introducción a Node v0.8
7
9
2.1. ¿Qué es Node? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.2. “Es una plataforma” . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.1. El proceso de arranque de Node . . . . . . . . . . . . . . . . . .
9
2.2.2. El formato CommonJS . . . . . . . . . . . . . . . . . . . . . . . 14
2.2.3. Módulos disponibles en el core de Node
. . . . . . . . . . . . . 15
2.2.4. Módulos de terceras partes . . . . . . . . . . . . . . . . . . . . . 20
2.3. “Construida encima del entorno de ejecución de JavaScript de Chro-
me” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.3.1. El lenguaje JavaScript . . . . . . . . . . . . . . . . . . . . . . . . 22
2.3.2. El motor V8 de Google . . . . . . . . . . . . . . . . . . . . . . . . 24
2.4. “Fácil desarrollo de rápidas, 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 ejecución de funciones . . . . . . . . . . . . . . 34
. . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.6. “Es ligero y eficiente” [1]
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. Módulos Buffer y Dgram
39
3.1. Aspectos de UDP relevantes para Node . . . . . . . . . . . . . . . . . . 39
3.2. UDP en Node . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.3. Codificación de caracteres . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.4. Buffers en Javascript
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.5. Aplicación con Buffers y UDP . . . . . . . . . . . . . . . . . . . . . . . 50
3.5.1. Descripción del problema . . . . . . . . . . . . . . . . . . . . . . 50
3.5.2. Diseño propuesto . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.5.2.1. El protocolo RTP . . . . . . . . . . . . . . . . . . . . . . 52
3.5.2.2. Descripción de la solución . . . . . . . . . . . . . . . . 54
3.6. Objetivos de los Koans . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
3.7. Preparación del entorno y ejecución de los Koans . . . . . . . . . . . . 62
3.8. Conclusión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4. Módulos 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. Aplicación con Streams TCP . . . . . . . . . . . . . . . . . . . . . . . . 78
4.4.1. Descripción del problema . . . . . . . . . . . . . . . . . . . . . . 78
4.4.2. Diseño propuesto . . . . . . . . . . . . . . . . . . . . . . . . . . 79
4.5. Objetivos de los Koans . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
4.6. Preparación del entorno y ejecución de los Koans . . . . . . . . . . . . 85
4.7. Conclusión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
5. Módulo 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. Aplicación con HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
5.3.1. Descripción del problema . . . . . . . . . . . . . . . . . . . . . . 110
5.3.2. Diseño propuesto . . . . . . . . . . . . . . . . . . . . . . . . . . 112
5.4. Objetivos de los Koans . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
5.5. Preparación del entorno y ejecución de los Koans . . . . . . . . . . . . 119
5.6. Conclusión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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. Aplicación de ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
6.4.1. Clon de Twitter, objetivo 1: autenticación y control de sesiones 140
6.4.1.1. Descripción del Objetivo . . . . . . . . . . . . . . . . . . 140
6.4.1.2. Diseño propuesto al Objetivo implementado con Ex-
press . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
6.4.1.3. Objetivos de los Koans
. . . . . . . . . . . . . . . . . . 149
6.4.1.4. Preparación del entorno y ejecución de los Koans . . . 150
6.4.2. Clon de Twitter, objetivo 2: publicación de whizs y follow y
unfollow de otros usuarios . . . . . . . . . . . . . . . . . . . . . 151
6.4.2.1. Descripción del Objetivo . . . . . . . . . . . . . . . . . . 151
6.4.2.2. Diseño propuesto al Objetivo implementado con Ex-
press . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
. . . . . . . . . . . . . . . . . . 154
6.5. Conclusión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
6.4.2.3. Objetivos de los Koans
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
. . . . . . . . . . . . . 158
7.1.2. “en cada navegador y dispositivo móvil”
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. Aplicación con Socket.IO . . . . . . . . . . . . . . . . . . . . . . . . . . 176
7.3.1. Descripción del juego . . . . . . . . . . . . . . . . . . . . . . . . 176
7.3.2. Objetivos perseguidos . . . . . . . . . . . . . . . . . . . . . . . . 176
7.3.3. Diseño propuesto . . . . . . . . . . . . . . . . . . . . . . . . . . 177
7.3.4. Implementación con Socket.IO . . . . . . . . . . . . . . . . . . . 181
7.4. Objetivos de los Koans . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
7.5. Preparación del entorno y ejecución de los Koans . . . . . . . . . . . . 187
7.6. Conclusión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
8. Conclusión y trabajos futuros
189
A. Listados
191
A.1. Módulos dgram y Buffer
. . . . . . . . . . . . . . . . . . . . . . . . . . 191
A.2. Módulos net y Stream . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
A.3. Módulo http . . . . .
Comentarios de: Introduccion a Nodejs a través de Koans (1)