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

Curso Desarrollo en Backend con Node.js

By mariogl

Curso Desarrollo en Backend con Node.js

Curso Desarrollo en Backend con Node.js 13-19 octubre 2020

  • 832