8. Node.js

8.1. Instalación y uso de Node.js en Ubuntu

  • Instalar nodejs
  • Instalar npm
  • Las versiones de los repositorios de Ubuntu no son las más actuales, para actualizarlos:
    curl -sL https://deb.nodesource.com/setup_8.x | sudo bash -
    sudo apt install nodejs
  • nodejs archivo.js & (ejecuta el código, & para que se quede en segundo plano, se puede matar el proceso con “pkill nodejs”)
    • Es importante iniciar y matar nodejs con el usuario que sea propietario de los archivos que se van a ejecutar
  • sudo npm install paquete (instala módulos)
  • npm init: crea un archivo package.json con los paquetes que usa la aplicación.
  • npm start: busca la propiedad "start: 'node index.js'", dentro de "scripts" del package.json
  • Es un sistema asíncrono, lo que significa que cuando hace una petición al servidor, sigue ejecutando las tareas siguientes mientras espera la respuesta. Una forma de asegurarse de que no ejecuta una acción antes de tiempo, es estructurar el código de la siguiente manera, con métodos anidados (respuestas , "callbacks"):
    metodo(argumento, function(err, res){
        if(err) throw err; #u otras fórmulas, como: assert.equal(null,err)
        metodoanidado(argumento, function(err, res){
            assert.equal(null, err);
            …
        });
    });

8.2. Uso con Apache

  • sudo a2enmod proxy_http
  • En la configuración de Apache:
    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/

8.3. Uso con Nginx

  • En la configuración del sitio:
server {
listen 80;
server_name test.rs1.es;
location / {
proxy_pass http://localhost:8080;
}
}
  • Ejemplo que permite el uso de archivos estáticos (css, scripts del lado del cliente,...) en Node:
upstream backend {
server localhost:8080;
}
server {
listen 80;
server_name node.rs1.es;
root /var/www/node/static;
location / {
try_files $uri @backend;
}
location @backend {
proxy_pass http://backend;
}
}

8.4. Creación de un servidor web

var http = require('http');
http.createServer(function(req, res){
    res.writeHead(200, {'Content-type':'text/html'});
    res.write('' + '');
    res.end();
}).listen(8080);
var http = require('http');
var fs = require('fs');
http.createServer(function (req, res) {
  fs.readFile('index.html', function(err, data){
    res.writeHead(200, {'Content-type':'text/html'});
    res.write(data);
    res.end();
  });
}).listen(8080);

8.5. Formulario de subida de archivos al servidor

var http = require('http');
var fs = require('fs');
var formidable = require('formidable');
http.createServer(function(req,res){
if (req.url == '/upload') {
var form = new formidable.IncomingForm();
form.parse(req, function (err, fields, files) {
var oldpath = files.filetoupload.path;
var newpath = './' + files.filetoupload.name;
fs.rename(oldpath, newpath, function(err){
    if (err) throw err;
    res.write('Archivo subido');
     res.end();
});
});
} else {
    fs.readFile('index.html', function(err,data){
res.writeHead(200, {'Content-type':'text/html'});
res.write(data);
res.end();
});
}
}).listen(8080);