Diferencia entre revisiones de «Node.js y MongoDB»

De Manuais Informática - IES San Clemente.
Ir a la navegación Ir a la búsqueda
(Página creada con «= Node.js = == Introducción a Node.js == [http://nodejs.org/ Node.js] es un entorno '''JavaScript de lado de servidor''' que utiliza un '''modelo asíncrono''' y '''dirig…»)
(Sin diferencias)

Revisión del 10:39 4 dic 2019

Node.js

Introducción a Node.js

Node.js es un entorno JavaScript de lado de servidor que utiliza un modelo asíncrono y dirigido por eventos.

Node usa el motor de JavaScript V8 de Google: una VM tremendamente rápida y de gran calidad escrita por gente como Lars Bak, uno de los mejores ingenieros del mundo especializados en VMs.

No olvidemos que V8 es actualizado constantemente y es uno de los intérpretes más rápidos que puedan existir en la actualidad para cualquier lenguaje dinámico. Además las capacidades de Node para I/O (Entrada/Salida) son realmente ligeras y potentes, dando al desarrollador la posibilidad de utilizar a tope la I/O del sistema. Node soporta protocolos TCP, DNS y HTTP.


¿Qué diferencias tiene Node.js respecto a Apache u otros servidores web?

  • Apache crea un nuevo hilo por cada conexión cliente-servidor. Esto funciona bien para pocas conexiones, pero crear nuevos hilos tiene un coste, así como la realización de cambios de contexto. A partir de 400 conexiones simultáneas, el número de segundos para atender las peticiones crece considerablemente. Podemos decir que Apache funciona bien pero no es el mejor servidor para lograr máxima concurrencia (lograr tener el número mayor de conexiones abiertas posibles).
  • Uno de los puntos fuertes de Node es su capacidad de mantener muchas conexiones abiertas y esperando. En Apache por ejemplo el parámetro MaxClients por defecto es 256. Este valor puede ser aumentado para servir contenido estático, sin embargo si se sirven aplicaciones web dinámicas en PHP u otro lenguaje es probable que al poner un valor alto el servidor se quede bloqueado ante muchas conexiones -esto dependerá del trabajo que la aplicación web de al servidor y de su capacidad hardware-.
  • Una aplicación para Node se programa sobre un solo hilo. Si en la aplicación existe una operación bloqueante (entrada/salida por ejemplo), Node creará entonces otro hilo en segundo plano, pero no lo hará sistemáticamente por cada conexión como haría Apache.
  • En teoría Node puede mantener tantas conexiones como número máximo de archivos descriptores (sockets) soportados por el sistema. En un sistema UNIX este límite puede rondar por las 65.000 conexiones, un número muy alto. Sin embargo en la realidad la cifra depende de muchos factores, como la cantidad de información que esté la aplicación distribuyendo a los clientes.
  • Una aplicación con actividad normal podría mantener 20.000-25.000 clientes a la vez sin haber apenas retardo en las respuestas. Un inconveniente de Node es que debido a su arquitectura (de usar sólo un hilo) también sólo podrá usar una CPU. Un método para usar múltiples núcleos sería iniciar múltiples instancias de Node en el servidor y poner un balanceador de carga delante de ellos.

Node.js no es el único servidor de este tipo, hay otros proyectos como Tornado (Python), Twisted(Python),Apache Mina(Java), Jetty(Java), etc.

Otra buena alternativa puede ser el lenguaje Erlang el cuál permite crear sistemas en tiempo real con alta escalabilidad y alta disponibilidad.

Ejemplo de un código de node.js

var http = require('http');
var s = http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
});
s.listen(8000);
console.log('Server running!');

JavaScript es muy buen lenguaje para programar asíncronamente, ya que fue diseñado especialmente para ser usado en programación orientada a eventos. Esto le hace especialmente atractivo para realizar aplicaciones no bloqueantes y de alta concurrencia.

Otro ejemplo de código para node.js :

                
var fs = require('fs');

fs.readFile('report.txt', function(data) {
    console.log('Read: ' + data);
});

fs.writeFile('message.txt', 'Hello World!', function() {
    console.log('File saved!');
});

Cuando se ejecuta este código Node va a mandar leer un fichero y mandará también escribir en otro (siempre en el lado del servidor), y luego pasará a un estado de espera.

Cuando las operaciones se terminen se ejecutarán los callbacks asociados a cada tarea (las funciones anónimas que tenemos programadas). Debido a la peculiaridad de Javascript, no hay nada que garantice el orden en el que van a ser mostrados los mensajes de los callbacks (teóricamente el que termine antes se mostrará en primer lugar).

Esta manera de ejecutar las entradas y salidas (sin estar a la espera de que se terminen de forma secuencial, antes de pasar a la siguiente tarea), asegura que el hilo principal de programa siempre va a estar en ejecución realizando nuevas llamadas a tareas que hayan sido programadas.

Cuando usar Node.js

Node es especialmente bueno en aplicaciones web que necesiten una conexión persistente con el navegador del cliente, ya que su consumo de recursos es mínimo y el número de clientes simultáneos soportados es altísimo.

Lista de aplicaciones para las que Node encajaría perfectamente:

  • Juegos online.
  • Gestores de correo online: de esta manera teniendo el navegador abierto podríamos ver notificaciones en tiempo real de nuevos correos recibidos.
  • Herramientas de colaboración.
  • Chats.
  • Redes sociales: por ejemplo para actualizar automáticamente tu muro de novedades.
  • Herramientas de traducción en tiempo real.

Cuando no usar Node.js

Node tiene muchas ventajas, pero como en todo no hay herramientas ni peores ni mejores, sino unas que se ajustan mejor a unos casos de uso que otras.

  • ¿Son importantes tiempos de respuesta bajos y alta concurrencia?
  • ¿El número de usuarios activos va a ser considerable?
  • ¿El proyecto es pequeño? Si es grande, ¿se disponen de las librerías/drivers de DB necesarias para trabajar desde JavaScript?

Si en dichas preguntas has respondido sí, entonces Node se adapta perfectamente como solución a tus problemas. Si has respondido no a alguna pregunta entonces posiblemente Node no sea la mejor solución para ese software.

Librerías interesantes para Node.js

  • Socket.IO: "Socket.IO aims to make realtime apps possible in every browser and mobile device, blurring the differences between the different transport mechanisms. Under the hoods, Socket.IO will use feature detection to decide if the connection will be established with WebSocket, AJAX long polling, etc (see supported transports), making creating realtime apps that work everywhere a snap."
  • Express: un framework web sobre Node.
  • node.dbslayer.js: "ofrece soporte MySQL para Node"
  • Handlebars.js: "para crear plantillas fácilmente"
  • MongoDB driver o Mongoose.

Información sobre Node.js extraída de http://www.rmunoz.net/introduccion-a-node-js.html

Instalacion de Node.js y npm (node packet manager) en Debian

Veamos como realizar la instalación de Node.js y el gestor de paquetes de Node npm.

Instalación de Node.js en Debian

Para instalar la última versión de Nodejs haremos lo siguiente:

curl -sL https://deb.nodesource.com/setup_13.x | sudo bash -

# Instalamos a continuación nodejs y npm
apt-get install -y nodejs

# Chequeamos la versión instalada:
node -v

v13.2.0

Comandos básicos en el uso de Node.js

Desde la línea de comandos de node podemos teclear instrucciones para ejecutar aplicaciones o bien escribir una aplicación. En general lo que se suele hacer es crear un fichero .js con las instrucciones de la aplicación que va a ejecutar Node.

El entorno de trabajo al que se accede desde la línea de comandos se denomina REPL.

// Para acceder a la línea de comandos REPL de node:
node

// Accederemos a la consola de trabajo indicada con el símbolo >

// Para consultar ayuda de node:
> .help

// Para salir de node:
> .exit
// O bien CTRL+C CTRL+C

// Ejemplo de código de javascript en el entorno REPL de node:
>a=4;
4


// Ejemplo de pequeño programa en linea de comandos >:
> a=[1,2,3];
> a.forEach(function(valor){
..... console.log(valor);
..... });

// Producirá como resultado
1
2
3

Ejemplo de video con comandos de prueba en el entorno REPL de Node:

Creación de un servidor web en Nodejs

Una de las grandes ventajas de Nodejs es su simplicidad. A diferencia de PHP o ASP en NodeJS no hay separación entre el servidor web y el propio código de la aplicación, ni tampoco tenemos que editar grandes ficheros de configuración para definir un comportamiento concreto. Con Node creamos el servidor, lo configuramos y entregamos el contenido y todo a nivel de código.

Vamos a ver cómo crear un servidor web con Node y enviar contenido a través de él, con seguridad y eficiencia.

Ajustando las rutas

Para poder enviar contenido web necesitamos crear una URI (Universal Resource Identifier) que identifique el recurso al que queremos acceder. En otras palabras crear las diferentes rutas de la aplciación que mostrarán las diferentes páginas o contenidos de la web.

Lo primero que haremos será crear nuestro fichero de servidor. Por ejemplo le llamamos server.js

El proceso consistiría en:

  1. Escribir todo el código del servidor web y de nuestra aplicación dentro del fichero server.js.
  2. Guardar el fichero server.js
  3. Arrancar la aplicación con el comando: node server.js
  4. Y así una y otra vez, cada vez que hagamos modificaciones en el fichero.

Para evitar el tener que ejecutar el comando: node server.js cada vez que modifiquemos la aplicación, podemos utilizar una aplicación adicional llamada hotnode, que se encargará de reiniciar nuestra aplicación cada vez que modifiquemos el fichero server.js.

Instalamos hotnode de forma global, para utilizarlo más adelante con nuestro server:

# Instalamos hotnode globalmente
npm -g install hotnode

# Para ejecutar el servidor:
hotnode server.js

# Hotnode auto-reiniciará nuestro servidor cada vez que grabemos las modificaciones en el fichero.

Para crear el servidor web necesitamos un módulo denominado http, que instalaremos dentro de la carpeta dónde tendremos nuestro servidor:

# Instalamos el módulo http:
npm install http

# Código que va dentro del fichero server.js:

var http = require('http');
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/html'}); 
response.end('Funciona mi servidor con Node.js!');
}).listen(8080);

# Si estamos utilizando el VPS de Google tendremos que abrir en el firewall el puerto 8080 para permitir dicho tráfico al servidor:
# Lo haremos en:

Google Cloud Platform -> Red de VPC -> Reglas de cortafuegos

# Agregaremos una regla:
# Nombre: nodejs
# Descripción:  Para acceder al servidor de Node en 8080
# Destinos: Todas las instancias de la red
# Intervalos de IPs de origen: 0.0.0.0/0
# Protocolos y puertos: 
#  tcp: 8080
# Pulsamos el boton Crear.


# Para comprobar si funciona nuestro servidor web, nos tendremos que conectar a nuestro dominio pero al puerto 8080.
# Por ejemplo:

http://veiga.dynu.net:8080/

# Y se mostrará el mensaje:
Funciona mi servidor con Node.js!

Sirviendo ficheros estáticos

Cacheado de contenido en memoria para entrega inmediata

Optimización