Desarrollo en BackEnd con Node.js

Licencia de Creative Commons mario@mariogl.com

Temario

Desarrollo en BackEnd con Node.js

1. Introducción a Node.js
2. El Node Package Manager (npm)
3. Instalación de Node.js
4. Creación de un servidor
5. Análisis de los principales módulos Node.js
6. Utilización de JavaScript y nuevas características de ES7
7. Control de versiones con Git y GitHub
8. Introducción a express. Instalación y configuración
9. Callback Hell
10. Promise y Fetch
11. Asincronía
12. Fundamentos de RESTFul
13. Implementación de un API REST con Node.js
14. Interacción con el front. Fundamentos de React y Angular
15. Acceso a bases de datos NoSQL desde Node.js. MongoDB y DynamoDB
16. Operaciones Scan
17. Utilización de Amazon RDS

Conceptos iniciales

Desarrollo en BackEnd con Node.js

Conceptos iniciales

  • ¿Qué es Node.js?

  • ¿Para qué se usa?

  • ECMAScript 6

  • Módulos JS

  • npm

  • Código bloqueante y código no bloqueante

Desarrollo en BackEnd con Node.js

Entorno de desarrollo

Desarrollo en BackEnd con Node.js

Entorno de desarrollo

Desarrollo en BackEnd con Node.js

"editor.codeActionsOnSave": {
  "source.fixAll.eslint": true
},
"typescript.suggestionActions.enabled": false
  

Entorno de desarrollo

Desarrollo en BackEnd con Node.js

Git

Desarrollo en BackEnd con Node.js

Git - comandos básicos para el curso

  • Clonar un repositorio:

        git clone URL
     

  • Descargar última versión del repositorio:

        git pull origin master

Desarrollo en BackEnd con Node.js

Git - configuración proxy

git config --global http.proxy http://username:password@host:port

git config --global https.proxy http://username:password@host:port

Desarrollo en BackEnd con Node.js

Node.js y npm

Desarrollo en BackEnd con Node.js

npm

  • Repositorio de paquetes distribuibles

  • Paquetes globales y paquetes locales

  • La carpeta node_modules

  • El archivo package.json:

    • npm init -y

    • Registro de dependencias

    • Dependencias de desarrollo y de producción

    • scripts

Desarrollo en BackEnd con Node.js

npm - comandos

  • Instalar un paquete globalmente:
        npm install -g paquete

  • Instalar un paquete de producción:
        npm install paquete

  • Instalar un paquete de desarrollo:
        npm install paquete --save-dev

  • Instalar todas las dependencias:
        npm install

  • Instalar las dependencias de producción:
        npm install --production

  • Listar paquetes instalados:

        npm list --depth=0        (locales)
        npm list -g --depth=0   (globales)

Desarrollo en BackEnd con Node.js

npm - comandos

Desarrollo en BackEnd con Node.js

  • Lanzar el ejecutable de un paquete:
    npx ejecutable

npm - configuración proxy

npm config set proxy http://username:password@host:port

npm config set https-proxy http://username:password@host:port

Desarrollo en BackEnd con Node.js

JavaScript

 

Desarrollo en BackEnd con Node.js

Desarrollo en BackEnd con Node.js

JavaScript

  • Interpretado, compilado y ejecutado en el navegador o en el entorno de ejecución Node.js

  • Cada navegador programa su propio motor de JS (Node.js usa V8)

  • Estandarización: ECMAScript

  • La versión ES6 o ES2015

Desarrollo en BackEnd con Node.js

JSON

  • Sintaxis del formato JSON

  • Tipos de datos

  • Mapeado con objetos de JS

{
  "cursos": [
    {
      "nombre": "Desarrollo en BackEnd con Node.js",
      "horas": 20,
      "presencial": false,
      "alumnos": [
        {
          "nombre": "Juan Luis",
          "apellidos": "Domingo Suárez",
          "edad": 36
        },
        {
          "nombre": "Carmen",
          "apellidos": "González Díaz",
          "edad": 39
        },
        {
          "nombre": "Joaquín",
          "apellidos": "Pérez Estivil",
          "edad": 42
        }
      ],
      "dias": ["M", "X", "J", "V", "L"]
    },
    {
      "nombre": "Control de versiones con Git",
      "horas": 16,
      "presencial": true,
      "alumnos": [
        {
          "nombre": "Marta",
          "apellidos": "García Cubierta",
          "edad": 44
        },
        {
          "nombre": "Carla",
          "apellidos": "Arnal Ayuso",
          "edad": 37
        },
        {
          "nombre": "David",
          "apellidos": "Corredera Pío",
          "edad": 41
        }
      ],
      "dias": ["L", "M", "X", "J"]
    }
  ]
}

ES6

  • let y const

let a = 3;

let a = 10;  // Error
var a = 12;  // Error

const b = 10;

b = 3; // Error

const obj = {
    x: 10,
    y: 12
}

obj.x = 15;  // OK

obj = {    // Error
    x: 15,
    y: 12
}

Desarrollo en BackEnd con Node.js

ES6

Desarrollo web avanzado con Node.js

  • let y const

  • Template literals

let nombre = "Antonio";

let cuadrado = function(x) {
    return x * x;
}

let n = Math.floor(Math.random() * 10);

let saludo1 = "Hola, " + nombre + ". El cuadrado de " + n + " es " + cuadrado(n) + ".";
let saludo2 = `Hola, ${nombre}. El cuadrado de ${n} es ${cuadrado(n)}.`;

Desarrollo en BackEnd con Node.js

ES6

Desarrollo web avanzado con Node.js

  • let y const

  • Template literals

  • for ... of

let nombres = ["Patricia", "Zacarías", "Miguel", "Maite"];

for (let i in nombres) {
    console.log(nombres[i]);
}

for (let nombre of nombres) {
    console.log(nombre);
}

let obj = {
    x: 3,
    y: 4
}

for (let i in obj) {
    console.log(obj[i]);
}

let nombre = "Antonio Jesús";

for (let c of nombre) {
    console.log(c);
}

Desarrollo en BackEnd con Node.js

ES6

Desarrollo web avanzado con Node.js

  • let y const

  • Template literals

  • for ... of

  • Funciones

    • Parámetros por defecto

function potencia(x, y = 2) {
    return Math.pow(x, y);
}

console.log(`10 elevado a 8 es ${potencia(10, 8)}`);
console.log(`El cuadrado de 5 es ${potencia(5)}`);

Desarrollo en BackEnd con Node.js

ES6

Desarrollo web avanzado con Node.js

  • let y const

  • Template literals

  • for ... of

  • Funciones

    • Parámetros por defecto

    • Funciones anónimas

    • Funciones de primera clase

    • Funciones de orden superior

    • Función arrow:

      (parámetros) => expresión_devuelta;

Desarrollo en BackEnd con Node.js

const potencia = function (x, y = 2) {
    return Math.pow(x, y);
}

const potencia = (x, y = 2) => Math.pow(x, y);

setTimeout(() => console.log("pausa"), 2000);

ES6

Desarrollo web avanzado con Node.js

  • Operador spread

    • Parámetros en funciones

    • Enviar varios parámetros a partir de un array

    • push y unshift

    • Copiar un array en otro

    • Copiar un objeto en otro

    • Extender un objeto

// function(a, b, c)
let nums = [1, 3, 6];
function sumar(a, b, c) {
  console.log(a + b + c);
}
sumar(...nums);

// function(n parámetros)
let a = 3;
let b = 7;
let c = 8;

function sumar(...nums) {
  let suma = 0;
  for (n of nums) {
    suma += n;
  }
  console.log("La suma es " + suma);
}
sumar(a, b, c);

// push y unshift
let nums1 = [1, 3, 6];
let nums2 = [0, 52, 15, 9];

nums1.push(...nums2);
console.log(nums1);
nums1.unshift(...nums2);
console.log(nums1);

// copiar un array
let nums1 = [1, 3, 6];
let nums2 = [...nums1];

// copiar un objeto
let num1 = {
  parteEntera: 10,
  parteDecimal: 2
}
let num2 = { ...num1 };

// Extender un objeto
let num = {
  parteEntera: 10,
  parteDecimal: 2
}
let numExtendido = {
  ...num,
  separador: "."
}

Desarrollo en BackEnd con Node.js

ES6

Desarrollo web avanzado con Node.js

Desarrollo en BackEnd con Node.js

  • Clases

    • Propiedades y métodos

class A {

    constructor(z) {
        this.x = 3;
        this.y = 10;
        this.z = z;
    }

    suma() {
        return this.x + this.y + this.z;
    }

}

let a = new A(20);

console.log(a.suma());

ES6

Desarrollo web avanzado con Node.js

Desarrollo en BackEnd con Node.js

  • Clases

    • Propiedades y métodos

    • Herencia con extends y super()

class A {

    constructor(z) {
        this.x = 3;
        this.y = 10;
        this.z = z;
    }

    static getPI() {
        return 3.14159;
    }

    suma() {
        return this.x + this.y + this.z;
    }

    set zeta(z) {
        this.z = z * 2;
    }

    get zeta() {
        return this.z / 2;
    }
}

class B extends A {
    constructor() {
        super(100);
        this.x = 20;
    }

    suma() {
        return this.x + this.z;
    }

    resta() {
        return this.x - this.z;
    }
}

let b = new B();

console.log(b.suma());
console.log(b.resta());

Métodos de los arrays

Desarrollo web avanzado con Node.js

  • Métodos:

    • map

let nombres = ["juan", "luisa", "amparo", "arturo"];

nombres = nombres.map(nombre => nombre.toUpperCase());

console.log(nombres);

Desarrollo en BackEnd con Node.js

Métodos de los arrays

Desarrollo web avanzado con Node.js

  • Métodos:

    • map

    • filter

let personas = [
    {
        nombre: "juan",
        edad: 15
    },
    {
        nombre: "luisa",
        edad: 35
    },
    {
        nombre: "amparo",
        edad: 17
    },
    {
        nombre: "arturo",
        edad: 32
    }
];

let mayoresEdad = personas.filter(persona => persona.edad >= 18);

console.log(mayoresEdad);

Desarrollo en BackEnd con Node.js

Métodos de los arrays

Desarrollo web avanzado con Node.js

  • Métodos:

    • map

    • filter

    • reduce

let nums = [2, 4, 10, 15, 12];

let suma = nums.reduce((x, y) => x + y);

let objs = [
    {
        x: 3,
        y: 2
    },
    {
        x: 8,
        y: 10
    },
    {
        x: 10,
        y: 15
    }
]

let sumaX = objs.reduce((x, o2) => x + o2.x, 0);            // Método 1
let sumaX = objs.map(o => o.x).reduce((x, y) => x + y);     // Método 2

Desarrollo en BackEnd con Node.js

Métodos de los arrays

Desarrollo web avanzado con Node.js

  • Métodos:

    • map

    • filter

    • reduce

    • forEach

let notas = [
    {
        nombre: "juan",
        nota: 6
    },
    {
        nombre: "luisa",
        nota: 8
    },
    {
        nombre: "amparo",
        nota: 4
    },
    {
        nombre: "arturo",
        nota: 3
    }
];

let notasAprobados = notas.forEach(nota => {
  console.log(`${nota.nombre} ha sacado un ${nota.nota}..`)
})

Desarrollo en BackEnd con Node.js

Módulos

Desarrollo web avanzado con Node.js

Desarrollo en BackEnd con Node.js

Módulos

Desarrollo web avanzado con Node.js

  • Importar: require()

  • Exportar:

    • exports.

    • module.exports

  • Módulos del core

  • Módulos de terceros

  • Módulos locales

Desarrollo en BackEnd con Node.js

Entornos

Desarrollo web avanzado con Node.js

Desarrollo en BackEnd con Node.js

Entornos

Desarrollo web avanzado con Node.js

  • Usar variables de entorno

  • Pasar la variable en package.json

  • Recoger la variable con process.env

  • La variable de entorno NODE_ENV

  • El paquete dotenv

Desarrollo en BackEnd con Node.js

Utilidades

Desarrollo web avanzado con Node.js

Desarrollo en BackEnd con Node.js

Utilidades

Desarrollo web avanzado con Node.js

  • nodemon

  • chalk

  • debug

  • commander

  • inquirer

Desarrollo en BackEnd con Node.js

Utilidades - chalk

Desarrollo web avanzado con Node.js

const chalk = require('chalk');

console.log(chalk.red('Error'));
console.log(chalk.blue('Todo bien'));

Utilidades - debug

Desarrollo web avanzado con Node.js

const debug = require('debug')('pruebas');

debug('Hola');


// package.json:

scripts: {
    start: "SET DEBUG=pruebas & node index.js"
}

Utilidades - debug

Desarrollo web avanzado con Node.js

"outputCapture": "std",
"console": "integratedTerminal"
  • Configuración para que funcione con el modo debug del VS Code: añadir al launch.json

Utilidades - commander

Desarrollo web avanzado con Node.js

const program = require('commander');

program
    .option('-s --saluda', 'Emite saludo')
    .option('-t --texto [txt]', 'Texto')
    .parse(process.argv);

if (program.saluda) {
    if (program.texto) {
        console.log(program.texto);
    } else {
        console.log("¡Hola!");
    }
}

Utilidades - inquirer

Desarrollo web avanzado con Node.js

const inquirer = require('inquirer');

const prompt = inquirer.createPromptModule();

prompt([
    {
        type: 'confirm',
        name: 'mayor',
        message: '¿Estás en edad de trabajar?'
    },
    {
        type: 'list',
        name: 'profesion',
        message: '¿Cuál es tu profesión?',
        default: 0,
        choices: [
            {
                name: 'Programador',
                value: 'programador'
            },
            {
                name: 'Cualquier otra',
                value: 'otra'
            },
            {
                name: 'Ninguna',
                value: 'ninguna'
            }
        ],
        when: respuestas => respuestas.mayor
    }]).then(resp => {        
		// resp es un array con las respuestas
    });

Asincronía

Desarrollo web avanzado con Node.js

Desarrollo en BackEnd con Node.js

Asincronía

Desarrollo web avanzado con Node.js

  • Callbacks

  • El patrón callback(err, ...)

  • Callback hell

  • Promesas:

    • then()

    • catch()

  • async/await

Desarrollo en BackEnd con Node.js

Peticiones HTTP

Desarrollo web avanzado con Node.js

Desarrollo en BackEnd con Node.js

Peticiones HTTP - cliente

Desarrollo web avanzado con Node.js

  • El paquete node-fetch

  • Promesas

  • Recoger la respuesta en formato JSON

Desarrollo en BackEnd con Node.js

Peticiones HTTP - servidor

Desarrollo web avanzado con Node.js

  • El módulo http

  • Express

  • Middlewares:

    • morgan

    • body-parser

    • Propios

    • Gestor de errores

  • Rutas

Desarrollo en BackEnd con Node.js

Bases de datos

Desarrollo web avanzado con Node.js

Desarrollo en BackEnd con Node.js

Bases de datos

Desarrollo web avanzado con Node.js

  • Relacionales

  • NoSQL

Desarrollo en BackEnd con Node.js

MongoDB

Desarrollo web avanzado con Node.js

  • documentos = "colecciones"

  • El ODM Mongoose

  • Schema

  • Model

  • Queries

    • find, findOne

    • findById

    • create

Desarrollo en BackEnd con Node.js

RDS

Desarrollo web avanzado con Node.js

  • Gestor de BBDD relacionales

  • El ORM sequelize

  • Model

  • Queries

    • findAll, findOne

    • findByPK

    • create

Desarrollo en BackEnd con Node.js

Desarrollo web avanzado con Node.js

Desarrollo en BackEnd con Node.js

Links

Desarrollo web avanzado con Node.js

Desarrollo en BackEnd con Node.js