Índice del curso de node JS

  1. ¿Qué es NodeJS?
  2. Instalación de NodeJS
  3. Hola Mundo
  4. package.json
  5. Módulos
  6. Módulo para actualizar los cambios
  7. express
    1. Generación de un proyecto express
    2. Rutas con Express
    3. Enviar un array a la vista
  8. Mysql
    1. Express con mysql - ejemplo básico
    2. Mostrar errores Mysql
    3. Con parámetros
    4. Borrar
    5. Actualizar
    6. Ejercicio CRUD
    7. Consulta
    8. Sequelize
  9. Web Sockets con Express
  10. Imprimir los logs en un fichero de texto
  11. Handlebars - hbs
  12. Variables de sesión
  13. CORS
  14. JWT (JSON Web Tokens) usando express
  15. Middleware
  16. express sin express-generator
  17. Servidor web sin express
  18. Publicar un plugin en npm
  19. Chokidar

Servidor web sin express

Modulo http

Cuando trabajamos con la plataforma Node.js debemos codificar nosotros el servidor web, al contrario de lo que ocurre por ejemplo en PHP en el que tenemos un servidor Apache disponible.

El siguiente código muestra el mensaje "Sitio en desarrollo" para todas las peticiones que se efectuen al puerto 8888 del servidor.

var http=require('http');

var servidor=http.createServer(function(pedido,res){
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write('<h1>Sitio en desarrollo</h1>');
    res.end();
});

servidor.listen(8888);

console.log('Servidor web iniciado');

Servidor web de páginas estáticas

index.html<a href="pagina1.html">PAGINA 1</a><br>
                <a href="pagina2.html">PAGINA 2</a>
static/pagina1.htmlPAGINA 1
static/pagina2.htmlPAGINA 2
servidor.jsvar http=require('http');
var url=require('url');
var fs=require('fs');

var servidor=http.createServer(function(pedido,respuesta){
    var objetourl = url.parse(pedido.url);
    var camino='static'+objetourl.pathname;
    if (camino=='static/')camino='static/index.html';
    fs.exists(camino,function(existe){
        if (existe) {
            fs.readFile(camino,function(error,contenido){
                if (error) {
                    respuesta.writeHead(500, {'Content-Type': 'text/plain'});
                    respuesta.write('Error interno');
                    respuesta.end();                    
                } else {
                    respuesta.writeHead(200, {'Content-Type': 'text/html'});
                    respuesta.write(contenido);
                    respuesta.end();
                }  
            });
        } else {
            respuesta.writeHead(404, {'Content-Type': 'text/html'});
            respuesta.write('Recurso inexistente');        
            respuesta.end();
        }
    });
});

servidor.listen(8888);

console.log('Servidor web iniciado');

Servidor de cualquier cosa

En el ejemplo anterior sólo servíamos páginas en formato html. Ahora vamos a servir además, imágenes, video, audio, etc.

var http=require('http');
    var url=require('url');
    var fs=require('fs');

    var mime = {
    'html' : 'text/html',
    'css'  : 'text/css',
    'jpg'  : 'image/jpg',
    'ico'  : 'image/x-icon',
    'mp3'  : 'audio/mpeg3',
    'mp4'  : 'video/mp4'
};

var servidor=http.createServer(function(pedido,respuesta){
    var objetourl = url.parse(pedido.url);
    var camino='static'+objetourl.pathname;
    if (camino=='static/')camino='static/index.html';
    fs.exists(camino,function(existe){
        if (existe) {
            fs.readFile(camino,function(error,contenido){
                if (error) {
                    respuesta.writeHead(500, {'Content-Type': 'text/plain'});
                    respuesta.write('Error interno');
                    respuesta.end();                    
                } else {
                    var vec = camino.split('.');
                    var extension=vec[vec.length-1];
                    var mimearchivo=mime[extension];
                    respuesta.writeHead(200, {'Content-Type': mimearchivo});
                    respuesta.write(contenido);
                    respuesta.end();
                }
            });
        } else {
            respuesta.writeHead(404, {'Content-Type': 'text/html'});
            respuesta.write('Recurso inexistente');        
            respuesta.end();
        }
    });
});

servidor.listen(8888);

console.log('Servidor web iniciado');

Creación de una caché en el servidor

var http=require('http');
    var url=require('url');
    var fs=require('fs');

    var mime = {
    'html' : 'text/html',
    'css'  : 'text/css',
    'jpg'  : 'image/jpg',
    'ico'  : 'image/x-icon',
    'mp3'  : 'audio/mpeg3',
    'mp4'  : 'video/mp4'
};

var cache={};

var servidor=http.createServer(function(pedido,respuesta){
    var objetourl = url.parse(pedido.url);
    var camino='static'+objetourl.pathname;
    if (camino=='static/')camino='static/index.html';
    if (cache[camino]) {
        var vec = camino.split('.');
        var extension=vec[vec.length-1];
        var mimearchivo=mime[extension];
        respuesta.writeHead(200, {'Content-Type': mimearchivo});
        respuesta.write(cache[camino]);
        respuesta.end();
        console.log('Recurso recuperado del cache:'+camino);               
    } else {
        fs.exists(camino,function(existe){
            if (existe) {
                fs.readFile(camino,function(error,contenido){
                    if (error) {
                        respuesta.writeHead(500, {'Content-Type': 'text/plain'});
                        respuesta.write('Error interno');
                        respuesta.end();                    
                    } else {
                        cache[camino]=contenido;
                        var vec = camino.split('.');
                        var extension=vec[vec.length-1];
                        var mimearchivo=mime[extension];
                        respuesta.writeHead(200, {'Content-Type': mimearchivo});
                        respuesta.write(contenido);
                        respuesta.end();
                        console.log('Recurso leido del disco:'+camino);
                    }
                });
            } else {
                respuesta.writeHead(404, {'Content-Type': 'text/html'});
                respuesta.write('Recurso inexistente');        
                respuesta.end();
            }
        });
    }
});

servidor.listen(8888);

console.log('Servidor web iniciado');

Recuperación de datos por POST

var http=require('http');
    var url=require('url');
    var fs=require('fs');
    var querystring = require('querystring');

    var mime = {
    'html' : 'text/html',
    'css'  : 'text/css',
    'jpg'  : 'image/jpg',
    'ico'  : 'image/x-icon',
    'mp3'  :    'audio/mpeg3',
    'mp4'  : 'video/mp4'
};

var servidor=http.createServer(function(pedido,respuesta){
    var objetourl = url.parse(pedido.url);
    var camino='public'+objetourl.pathname;
    if (camino=='public/')camino='public/index.html';
    encaminar(pedido,respuesta,camino);
});

servidor.listen(8888);


function encaminar (pedido,respuesta,camino) {
    switch (camino) {
        case 'public/recuperardatos': {
            recuperar(pedido,respuesta);
            break;
        }    
        default : {  
            fs.exists(camino,function(existe){
                if (existe) {
                    fs.readFile(camino,function(error,contenido){
                        if (error) {
                            respuesta.writeHead(500, {'Content-Type': 'text/plain'});
                            respuesta.write('Error interno');
                            respuesta.end();                    
                        } else {
                            var vec = camino.split('.');
                            var extension=vec[vec.length-1];
                            var mimearchivo=mime[extension];
                            respuesta.writeHead(200, {'Content-Type': mimearchivo});
                            respuesta.write(contenido);
                            respuesta.end();
                        }
                    });
                } else {
                    respuesta.writeHead(404, {'Content-Type': 'text/html'});
                    respuesta.write('Recurso inexistente');        
                    respuesta.end();
                }
            });    
        }
    }    
}


function recuperar(pedido,respuesta) {
    var info = '';
    pedido.on('data', function(datosparciales){
        info += datosparciales;
    });
    pedido.on('end', function(){
        var formulario = querystring.parse(info);
        respuesta.writeHead(200, {'Content-Type': 'text/html'});
        var pagina='Nombre de usuario:'+formulario['nombre']+'<br>'+
        'Clave:'+formulario['clave'];
        respuesta.end(pagina);
    });    
}

console.log('Servidor web iniciado');

Creación de un chat usando sockets sin express

npm init
npm i socket.io
npm i express
index.html
        <ul id="messages"></ul>
        <form action="">
        <input id="m" autocomplete="off" /><button>Send</button>
        </form>
        <script src="https://cdn.socket.io/socket.io-1.2.0.js"></script>
        <script src="https://code.jquery.com/jquery-1.11.1.js"></script>
        <script>
        $(function () {
        var socket = io();
        //Este código se ejecuta cada vez que mando un mensaje
        $('form').submit(function(){
        console.log("yo mando un mensaje");
        socket.emit('mensaje', $('#m').val());
        return false;
    });

    //Este código se ejecuta cada vez que alguien manda un mensaje
    socket.on('mensaje', function(msg){
    console.log("alguien manda un mensaje")
    $('#messages').append($('<li>').text(msg));
});
});
</script>
index.jsvar app = require('express')();
    // Creamos nuestro servidor de aplicaciones http
    var http = require('http').Server(app);
    // Creamos nuestro servidor de websockets para ejecutar en el servidor anterior
    var io = require('socket.io')(http);
    //Escucharemos el puerto 3000
    var port = process.env.PORT || 3000;

    app.get('/', function(req, res){
    res.sendFile(__dirname + '/index.html');
});

//Detectamos cuando un nuevo usuario se conecta
io.on('connection', function(socket){
//El siguiente código es lanzado cada vez que alguien lanza un mensaje
socket.on('mensaje', function(msg){
//Recogemos el evento de mandar un mensaje en el cliente
io.emit('mensaje', msg);
});
});

http.listen(port, function(){
console.log('listening on *:' + port);
});
icono de mandar un mail¡Contacta conmigo!
Pablo Monteserín
contacta conmigoPablo Monteserín

Para dudas técnicas sobre los ejercicios de mis cursos es necesario estar suscrito.