C4 - Backend con Node.js

Full Stack amb React

Full Stack amb React

Full Stack amb React

Full Stack amb React

  • ¿Qué es Node.js?

  • ¿Para qué se usa?

  • ECMAScript 6

  • Módulos JS

  • npm

  • Código bloqueante y código no bloqueante

Conceptos iniciales

Full Stack amb React

Full Stack amb React

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

  • Compatibilidad con ES6+

Full Stack amb React

Full Stack amb React

Módulos

  • Importar: require()

  • Exportar:

    • exports.loquesea

    • module.exports

  • Módulos del core

  • Módulos de terceros

  • Módulos locales

Full Stack amb React

Full Stack amb React

El objeto process

  • Propiedades útiles:

    • platform

    • env

    • version

    • argv

  • Métodos útiles:

    • exit(codigoStatus)

  • Eventos útiles:

    • beforeExit

Full Stack amb React

Full Stack amb React

Módulos del core: el módulo os

  • Métodos útiles:

    • freemem()

    • homedir()

    • version()

    • userInfo()

Full Stack amb React

Full Stack amb React

Módulos del core: el módulo path

  • Métodos útiles:

    • join(ruta1, ruta2, ruta3)

    • dirname(ruta)

    • basename(ruta, [ext])

    • extname(ruta)

const path = require("path");

const archivo = path.join(__dirname, "imagenes", "fary.png");
console.log(archivo);

const nombreFoto = path.basename(archivo, path.extname(archivo));
console.log(nombreFoto);

Full Stack amb React

Full Stack amb React

Módulos del core: el módulo fs

  • Métodos útiles:

    • readdir(ruta, callback)

    • rename(nombreAntiguo, nombreNuevo)

    • mkdir(nombreDirectorio, callback)

    • access(nombreArchivo, callback)

    • writeFile(nombreArchivo, datos, callback)

    • readFile(nombreArchivo, callback)

Full Stack amb React

Full Stack amb React

Entornos

  • 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

Full Stack amb React

Full Stack amb React

Utilidades

  • nodemon

  • chalk

  • debug

  • prompt

  • commander

  • inquirer

Full Stack amb React

Full Stack amb React

Utilidades - chalk

const chalk = require('chalk');

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

Full Stack amb React

Full Stack amb React

Utilidades - debug

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

debug('Hola');

Full Stack amb React

Full Stack amb React

Utilidades - prompt

const prompt = require("prompt");

prompt.start();

prompt.get("nombre", (err, datos) => {
  console.log(`Tu nombre es ${datos.nombre}`);
});

prompt.get("nombre").then((datos) => {
  console.log(`Tu nombre es ${datos.nombre}`);
});

Full Stack amb React

Full Stack amb React

Utilidades - commander

const { program } = require('commander');

program
    .option('-s, --saluda', 'Emite saludo')
    .option('-t, --texto <txt>', 'Texto');

program.parse(process.argv);

const options = program.opts();

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

Full Stack amb React

Full Stack amb React

Utilidades - inquirer

const inquirer = require('inquirer');

inquirer.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
    });

Full Stack amb React

Full Stack amb React

Envío de email

  • El paquete nodemailer

  • El servicio de fake SMTP Ethereal

const nodemailer = require("nodemailer");

const transport = nodemailer.createTransport({
  host: "smtp.ethereal.email",
  port: 587,
  auth: {
    user: "brigitte92@ethereal.email",
    pass: "Xjpm2pK2f8bxdF4kgz"
  }
});

const mensaje = {
  from: "remitente@email.com",
  to: "destinatario@email.com",
  subject: "Correo electrónico de prueba",
  html: "<h1>Probando esto de enviar correos desde <strong>Node.js</strong></h1>"
};

transport.sendMail(mensaje, (err, info) => {
  if (err) {
    console.log(err);
  } else {
    console.log(info);
  }
});

Full Stack amb React

Full Stack amb React

Peticiones HTTP (cliente)

  • El paquete node-fetch

  • Promesas

  • Recoger la respuesta en formato JSON

Full Stack amb React

Full Stack amb React

Servidor con express

  • El paquete http

  • El framework express

  • Cadena de middlewares

  • Cada middleware se registra con use() o con get(), put(), post(), etc.

  • Cada función middleware recibe req, res y next. Debe llamar a next() si no termina la cadena.

  • La cadena se termina con una response.

  • El middleware con cuatro parámetros es el manejador de errores general (err, req, res, next)

Full Stack amb React

Full Stack amb React

Node.js y MySQL

  • ORM - Object-relation mapping

  • El ORM Sequelizer

  • Establecemos una conexión y la exportamos

  • A partir de la conexión, creamos un modelo con un schema (forma que tiene una entidad concreta de una tabla)

  • El modelo tiene una serie de métodos para lanzar peticiones a la base de datos.

const { Sequelize } = require("sequelize");

const sequelize = new Sequelize({
  host: "localhost",
  database: "baseDeDatos",
  username: "usuario",
  password: "contraseña",
  dialect: "mysql",
  logging: funcionAnonimaQueRecogeUnMensajeYLoProcesa
});

module.exports = sequelize;
const { DataTypes } = require("sequelize");
const sequelize = require("../db");

const Alumno = sequelize.define("Alumno", {
  id: {
    type: DataTypes.INTEGER,
    autoIncrement: true,
    primaryKey: true
  },
  nombre: {
    type: DataTypes.STRING(50),
    allowNull: false
  },
  apellidos: DataTypes.STRING(100),
  nota: {
    type: DataTypes.DECIMAL(3, 1),
    allowNull: false,
    defaultValue: 0
  }
}, {
  tableName: "alumnos",
  timestamps: false
});

module.exports = Alumno;
const Alumno = require("../db/modelos/alumno");

Alumno.findAll() // Devuelve todos los alumnos
Alumno.findAll({
  where: { condiciones }
}) // Devuelve los alumnos que cumplan las condiciones
Alumno.findByPk(3) // Devuelve un alumno por su primary key
Alumno.findOne({
  where: { condiciones }
})  // Devuelve el primer alumno que cumpla las condiciones
Alumno.create(alumno) // Crea el alumno
Alumno.update({ modificaciones }, { where: { condiciones }})  // Modifica los alumnos que cumplan las condiciones
Alumno.destroy({ where: { condiciones }}) // Elimina los alumnos que cumplan las condiciones

Full Stack amb React

Full Stack amb React

Node.js y MySQL

Full Stack amb React

Full Stack amb React

Node.js y MongoDB

  • ODM - Object-document mapping

  • El ODM Mongoose

  • Establecemos una conexión

  • A partir de la conexión, creamos un modelo con un schema (forma que tiene una entidad concreta de un documento)

  • El modelo tiene una serie de métodos para lanzar peticiones a la base de datos.

const mongoose = require("mongoose");

mongoose.connect(process.env.URL_MONGODB, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  useCreateIndex: true,
  useFindAndModify: false
}, err => {
  if (err) {
	// Gestionar el error
  }
  // Si llega hasta aquí, se ha conectado correctamente
});
const { Schema, model } = require("mongoose");

const AlumnoSchema = new Schema({
  nombre: {
    type: String,
    required: true
  },
  apellidos: String,
  nota: {
    type: Number,
    required: true
  },
  curso: {
    type: Schema.Types.ObjectId,
    ref: "Curso"
  }
});

const Alumno = model("Alumno", AlumnoSchema, "alumnos");

module.exports = Alumno;
const Alumno = require("../db/modelos/alumno");

Alumno.find() // Devuelve todos los alumnos
Alumno.find({condiciones }) // Devuelve los alumnos que cumplan las condiciones
Alumno.findById(id) // Devuelve un alumno por su id
Alumno.findOne({ condiciones })  // Devuelve el primer alumno que cumpla las condiciones
Alumno.create(alumno) // Crea el alumno
Alumno.updateMany({ condiciones }, alumno)  // Modifica los alumnos que cumplan las condiciones
Alumno.deleteMany({ condiciones }) // Elimina los alumnos que cumplan las condiciones

Full Stack amb React

Full Stack amb React

Node.js y MongoDB