Anuncios

Bienvenidos sean a este post, hoy veremos al objeto principal de las aplicaciones web.

Anuncios

En los dos posts anteriores hemos cubierto como son las clases en node.js en este post y como es el objeto EventEmitter en este otro post, ahora daremos un paso mas adelante mediante el objeto del titulo.

Anuncios

Como mencionamos al comienzo este es el objeto fundacional para todas las aplicaciones web de node.js, siendo este muy cercano al protocol HTTP y el cual requiere cierto conocimiento para su uso, pero afortunadamente en la mayoria de los casos dispondremos de un framework, como Express, que se encargara de todo esto.

Anuncios
Anuncios

En este post vimos de una manera muy simple como «crear» un servidor web, esto en gran medida es gracias a que HTTPServer es un objeto EventEmitter y si bien en el ejemplo visto anteriormente no se aplicaba directamente con sutiles modificaciones podemos hacerlo trabajar con un escuchador de eventos, para ello debemos crear un nuevo archivo con el nombre de server.mjs y le agregagremos el siguiente codigo:

server.mjs

import * as http from 'http';

const server = http.createServer();
server.on('request',(req, res) => {
        res.writeHead(200, {'Content-type':'text/plain'});
        res.end('Hola, Mundo!\n');
});
server.listen(8124, '127.0.0.1');
console.log(`Servidor corriendo en http://127.0.0.1:8124`);
Anuncios
Anuncios

Primero importaremos todo desde el modulo http, despues crearemos un objeto para el server mediante createServer, a este objeto le aplicaremos el escuchador para que mire por el request, en caso de recibirlo debe tener dos argumentos, en el segundo escribiremos primero el tipo de contenido y luego el mensaje a mostrar, por fuera le asignaremos mediante listen la habilitacion del puerto y la direccion para poder acceder al servidor, para finalmente mostrar el servidor habilitado si lo ejecutan quedara de la siguiente manera:

$ node server.mjs
Servidor corriendo en http://127.0.0.1:8124
Anuncios

Y si abren esa direccion en un navegador se vera de la siguiente manera

Anuncios

Como dijimos este server interactua siempre que recibe el evento request, el cual es propio del navegador, pero otro evento que se maneja es response y este es cuando se devuelve al momento de enviar la respuesta, vamos al codigo anterior y vamos a modificarlo de la siguiente manera:

import * as http from 'http';
import * as util from 'util';
import * as os from 'os';

const escucha = 'http://127.0.0.1:8124';
const server = http.createServer();

server.on('request',(req, res) => {
        var requrl = new URL(req.url, escucha);
        if (requrl.pathname == '/') inicio(req, res);
        else if(requrl.pathname == '/osinfo') info(req, res);
        else {
                res.writeHead(404, {'Content-type':'text/plain'});
                res.end("url incorrecta " + req.url);
        }
});

server.listen(8124, '127.0.0.1');
console.log(`Servidor corriendo en http://127.0.0.1:8124`);

function inicio(req, res)
{
        res.writeHead(200, {'Content-Type':'text/html'});
        res.end(`<html>
        <head><title>Hola, Mundo!</title></head>
        <body><h1>Hola, Mundo!</h1>
        <p><a href='/osinfo'>Info SO</a></p>
        </body></html>`);
}

function info(req, res)
{
        res.writeHead(200, {'Content-Type':'text/html'});
        res.end(`<html><head>
        <title>Info Sistema Operativo</title></head>
        <body><h1>Info Sistema Operativo</h1>
        <table>
        <tr><th>TMP DIR</th><td>${os.tmpdir()}</td></tr>
        <tr><th>HOST NAME</th><td>${os.hostname()}</td></tr>
        <tr><th>OS TYPE</th><td>${os.type()} ${os.platform}
                ${os.arch()} ${os.release()}</td></tr>
        <tr><th>MEMORIA</th><td>Total: ${os.totalmem()}
                Libre: ${os.freemem}</td></tr>
        <tr><th>CPU</th><td><pre>${util.inspect(os.cpus())}</pre></td></tr>
        </table></body></html>`);
}
Anuncios
Anuncios

Parecen muchos cambios y muy complicados pero no son tanto, el primero sera que agregamos dos modulos, uno de utilidades (util) y otro para el sistema operativo (os), despues agregaremos una nueva constante para la direccion que escucharemos para contectarnos. La otra modificacion es al momento de escuchar al servidor, la primera sera agregar un nuevo objeto para almacenar la url que tendremos en el navegador, req.url sera para el path en el navegador y le pasamos la nueva variable para la direccion de escucha para formar a la misma, con nuestra url creada usaremos un condicional para verificarla. El primer condicional verifica si pathname es igual a la barra invertida y asume que estamos en el home para luego llamar a la funcion inicio, el siguiente verifica si el path contiene a osinfo y en caso de ser verdadero llama a la funcion info pero tenemos un else donde si no se cumple ninguna de las dos condiciones anteriores genera una pagina de error, despues volvemos a generar el servidor a traves de listen y mostramos en pantalla el mensaje de antes, hablemos de la primera funcion nueva:

function inicio(req, res)
{
        res.writeHead(200, {'Content-Type':'text/html'});
        res.end(`<html>
        <head><title>Hola, Mundo!</title></head>
        <body><h1>Hola, Mundo!</h1>
        <p><a href='/osinfo'>Info SO</a></p>
        </body></html>`);
}
Anuncios

Es muy parecido a lo que vimos en el primer codigo pero con mas codigo, la principal diferencia es que en lugar de identificarlo como texto lo hace como html, en el otro metodo escribimos una pagina donde estableceremos el titulo de la pagina, en la pagina y un link, pasemos a la siguiente funcion:

function info(req, res)
{
        res.writeHead(200, {'Content-Type':'text/html'});
        res.end(`<html><head>
        <title>Info Sistema Operativo</title></head>
        <body><h1>Info Sistema Operativo</h1>
        <table>
        <tr><th>TMP DIR</th><td>${os.tmpdir()}</td></tr>
        <tr><th>HOST NAME</th><td>${os.hostname()}</td></tr>
        <tr><th>OS TYPE</th><td>${os.type()} ${os.platform}
                ${os.arch()} ${os.release()}</td></tr>
        <tr><th>MEMORIA</th><td>Total: ${os.totalmem()}
                Libre: ${os.freemem}</td></tr>
        <tr><th>CPU</th><td><pre>${util.inspect(os.cpus())}</pre></td></tr>
        </table></body></html>`);
}
Anuncios

En este hacemos exactamente lo mismo, pero aqui agregamos una tabla, en este caso mostraremos algunos datos del Sistema Operativo y del equipo y para ello usaremos a las herramientas importadas del modulo os, pero su estructura es igual a la funcion anterior, con esto comentado podemos pasar a probar el codigo

Anuncios

Con esto oficialmente ya tenemos una primera aproximacion a como podemos enviar las respuestas desde un servidor.

Anuncios

En resumen, hoy hemos visto la introduccion al objeto HTTPServer, como con un ejemplo de este post pudimos aplicarle un escuchador para trabajar con el EventEmitter, asi como despues con una pequeña modificacion para poder devolver paginas con informacion de nuestro equipo, espero les haya resutado util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50