Introducci贸n

1

Qu茅 necesitas para este curso y qu茅 aprender谩s sobre Node.js con Hapi

2

Conceptos principales de hapi y creaci贸n de nuestro primer servidor

3

Breve historia y estado actual

Creando un sitio b谩sico con Hapi

4

El objeto h, response y sus herramientas

5

Uso de plugins - Contenido est谩tico

6

Plantillas con Handlebars

7

Renderizado de vistas - Layout y template del home

8

Recibiendo par谩metros en una ruta POST - Creaci贸n del registro

9

Definir una mejor estructura con buenas pr谩cticas en Hapi

10

Validando la informaci贸n - Implementando Joi

11

Introducci贸n a Firebase

12

Creando un modelo y guardando en firebase

13

Implementando el login y validaci贸n del usuario

14

Autenticaci贸n de usuarios - Cookies y estado

15

Manejando errores

16

Visualizaci贸n de errores

17

Controlar el error 404 en inert y el error de validaci贸n

18

Repaso - Creaci贸n del modelo y controlador para preguntas

19

Repaso - Creaci贸n de las rutas para crear preguntas

20

Listar las 煤ltimas preguntas en el home

Aplicacion de conceptos avanzados

21

Enrutamiento avanzado - visualizando una pregunta

22

Enrutamiento avanzado - respondiendo una pregunta

23

Generando la l贸gica de la plantilla seg煤n si es creador o contribuidor

24

M茅todos de servidor - respuesta correcta

25

Usando m茅todos de servidor

26

Manejo del cach茅 - Agregando el home al cach茅

27

Procesamiento de archivos - Aceptando im谩genes

28

Logging con Good - Monitoreando el servidor

29

Creaci贸n de plugins - Teor铆a

30

Creaci贸n de plugins - Implementando un API REST

31

Estrateg铆as de autenticaci贸n - Asegurando el API REST

32

Seguridad b谩sica - Asegurando el servidor contra CSRF

33

Seguridad b谩sica - Asegurando el servidor contra XSS

Herramientas de desarrollo

34

Depuraci贸n del proyecto

35

Ecosistema de Hapi

Crea una cuenta o inicia sesi贸n

隆Contin煤a aprendiendo sin ning煤n costo! 脷nete y comienza a potenciar tu carrera

Uso de plugins - Contenido est谩tico

5/35
Recursos

Los plugins son m贸dulos o archivos de Javascript creados generalmente por terceros, que le adicionan funcionalidades al framework base de Hapi.

Para implementar un plugin nuevo a nuestro proyecto, lo primero es importarlo en el index.js con la funci贸n requier() de NodeJS. Luego es necesario registrarlo con await server.register(plugin).

Por el momento, incluiremos en nuestro proyecto los plugins de Inert y Path

const inert = require('inert')
const path = require('path')

El plugin Inert extiende los m茅todos disponibles en el objeto h, y Path nos permite definir una ubicaci贸n relativa para todos los routes de nuestro proyecto, entre otras cosas.

C贸digo: usando Inert para servir un directorio de archivos y
un index.html en el path 鈥/鈥

Aportes 16

Preguntas 5

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

This package has been deprecated
npm i inert

ahora es con npm i @hapi/inert

La forma de instalar hapi

npm install @hapi/hapi

Como tuve que instalar inert

npm i @hapi/inert

Y mi codigo

'use strict'

const Hapi = require('@hapi/hapi');
// SE IMPORTA EL PLUGING PARA SERVIR LOS ARCHIVOS ESTATICOS
// const inert = require('inert')
// SE IMPORTA path QUE PARTE DE NODE
const path = require('path')

// SE CREA EL SERVIDOR COMO OBJETO 
const server = Hapi.Server({
    // EL PUERTO SE ESTABLECE COMO PARAMETRO CON LA VARIALBLE DE ENTORNO PORT Y SI NO CON EL PUERTO 3000
    port: process.env.PORT || 3000,
    // CORRE EN EL LOCALHOST
    host: 'localhost',
    // SE DECLRAR LA VARIABLE/OBJETO PARA DECLRAR LA RUTA A LA CARPETA DE ARCHIVOS ESTATICOS
    routes: {
        files: {
            relativeTo: path.join(__dirname, 'public')
        }
    }
})

// DEFINICION DE FUNCI脫N PARA INICIALIZAR EL PROYECTO. INTENAMNETE HAY TAREAS ASINCRONAS
async function init() {
    try {
        // REGISTRAR LOS PLUGINS QUE HAPI VA A NECESITAR PARA SERVIR ARCHIVOS ESTATICOS
        await server.register(require('@hapi/inert'));

        // DEFINICI脫N DE RUTAS SE INDICA EL M脡TODO HTTP, URL Y CONTROLADOR/handler DE RUTA
        // SE DECLARAN DESPU脡S DEL PLUGIN YA QUE LAS RUTAS HACEN USO DEL MISOM PARA DEVOLVER ARCHIVOS ESTATICOS
        server.route({
            method: 'GET',
            path: '/home',
            handler: (req, h) => {
                // POR EL INERT SE TIENEN ACCESO AL METODO h.file()
                return h.file('index.html')
            }
        })
        // RUTA PARA SERVIR ARCHIVOS EST脕TICOS ASOCIADOS (IMG/CSS/JS)
        server.route({
            method: 'GET',
            path: '/{param*}',
            handler: {
                directory: {
                    path: '.',
                    index: ['index.html']
                }
            }
        })
        // ES EL METODO QUE INICIA EL SERVIDOR
        await server.start()
    } catch (error) {
        console.error(error)
        // SALIR DE NODEJS CON UN C脫DIGO DE ERROR (1), 0 ES UN CODIGO DE EXITO
        process.exit(1)
    }

    console.log(`Servidor lanzado en: ${server.info.uri}`)
}

// SE INICIALIZA EL PROCESO
init()

Hapi se actualiz贸, inert ya es parte de Hapi.
Se debe agregar
npm i -S @hapi/inert

la constante es =>
const inert = require(鈥橜hapi/inert鈥);

A cambiado bastante todo, el c贸digo que a d铆a de hoy me funciona

"use strict";

const Hapi = require("@hapi/hapi");
const inert = require("@hapi/inert");
const path = require("path");

const server = new Hapi.server({
  port: 3000,
  host: "localhost",
  routes: {
    files: {
      relativeTo: path.join(__dirname, "public"),
    },
  },
});

const provision = async () => {
  try {
    await server.register(inert);

    server.route({
      method: "GET",
      path: "/home",
      handler: (request, h) => {
        return h.file("index.html");
      },
    });

    server.route({
      method: "GET",
      path: "/{param*}",
      handler: {
        directory: {
          path: ".",
          redirectToSlash: true,
          index: true,
        },
      },
    });

    await server.register(inert);
    await server.start();
  } catch (error) {
    process.on("unhandledRejection", (err) => {
      console.log(err);
      process.exit(1);
    });
  }
  console.log("Server running on %s", server.info.uri);
};

provision();

Mi aporte en el c贸digo

'use strict'

// Requerir el modulo de hapi (Framework)
const Hapi = require('@hapi/hapi')
// Requerir el plugin de hapi para servir archivos estaticos
const inert = require('inert')
const path = require('path')

// Configurar el servidor de nuestra aplicaci贸n. En un contenedor (Docker) si marca error colocar 0.0.0.0 (todos)
const server = Hapi.server({
  port: process.env.PORT || 3000,
  host: 'localhost',
  // Definir propiedades generales para todas las rutas. (En este caso indico que las rutas que requieran archivos est谩ticos, se servir谩n desde la carpeta public)
  routes: {
    files: {
      relativeTo: path.join(__dirname, 'public')
    }
  }

})

// Definicion de funci贸n para inicializar el proyecto. Intenamnete hay tareas asincronas
async function init() {

  try {
    // Registrar los plugins que hapi va a necesitar (en este caso servir archivos estaticos)
    await server.register(inert)

    // Definici贸n de rutas (indicar el m茅todo HTTP, URL y controlador de ruta)
    // Se declaran despu茅s del plugin ya que las rutas hacen uso del misom para devolver archivos est谩ticos
    server.route({
      method: 'GET',
      path: '/home',
      handler: (req, h) => {
        // El plugin de inert inyecta el metodo file en el objeto h para servir un archivo est谩tico
        return h.file('index.html').code(200)
      }
    })

    // Ruta para servir archivos est谩ticos asociados (img/css/js)
    server.route({
      method: 'GET',
      path: '/{param*}',
      handler: {
        directory: {
          path: '.',
          redirectToSlash: true
        }
      }
    })

    // Arrancar el servidor de Hapi
    await server.start()
    console.log(`Servidor lanzado en: ${server.info.uri}`)
  } catch (error) {
    console.error(error)
    // Salir de nodeJS con un c贸digo de error (1), 0 es un c贸digo de exito
    process.exit(1)
  }
}

// Inicializar el proyecto
init();

Es importante mencionar que path es un m贸dulo nativo de NodeJS, no es un plugin.

Me percate que el c贸digo del curso con respecto a Hapi ha cambiado bastante. Les comparto el c贸digo funcional.

'use strict'
const hapi = require('hapi')
const inert = require('inert')
const path = require('path')

const server = hapi.Server({
    port: process.env.PORT || 3000,
    host: 'localhost',
    routes: {
        files: {
            relativeTo: path.join(__dirname, 'public')
        }
    }
})

const initRoutes = async () =>{
    server.route({
        method: 'GET',
        path: '/home',
        handler: (req, h) => {
            return h.file('index.html')
        }
    })

    server.route({
        method: 'GET',
        path: '/{param*}',
        handler: {
            directory: {
                path: '.',
                index: ['index.html']
            }
        }
    })
}

const main = async () =>{
    try {
        await server.register(inert)
        await server.start()
        await initRoutes()
        
    } catch {
        console.error(error)
        console.exit(1)
    }finally{
        console.log(`Servidor lanzado en ${server.info.uri}`)
    }
}

main()

En archivos y enlaces falta registrar inert

C煤al es la extensi贸n de VSC para visualizar el tama帽o de los archivos importados?

炉\锛(銉)锛/炉

cool

El audio esta muy bajo

隆Hola a todos!

Como han notado la implementaci贸n de este curso ha quedado resagada en el versionamiento de paquetes, les comparto que estoy dejando mi boilerplate hasta este punto utilizando typescript y eslint (sintaxis de es6 y sirviendo archivos est谩ticos desde carpeta public), cualquier feedback es bienvenida.

pre-release-1.zip

y PR abiertos en el repo: hapi repo

mmm, creo que express si est谩 comiendo le mercado a hapi

Para quienes les devuelve error de versi贸n de hapi:
Plugin @hapi/inert requires hapi version >=19.0.0 but found 18.1.0.

  • Eliminar version de hapi anterior a 19.0.0 con npm unsintall --save hapi.
    -Instalar version actualizada npm install @hapi/hapi (aqui va en la version 20.0.2
    -Cambiar el require del m贸dulo por const inert = requiere(鈥橜hapiinert鈥)