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

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Creación de plugins - Implementando un API REST

30/35
Recursos

Partiremos de la estructura que vimos en la clase anterior para desarrollar nuestra API REST.

En el método register del plugin definiremos tanto las rutas necesarias para acceder a nuestra API, como el handler que hace las veces de método del controlador para cada ruta. Además, en lugar de preparar y devolver una vista, devolveremos simplemente la salida por defecto de Hapi que es de formato JSON.

Luego de tener definidas todas las rutas, los handlers con los parámetros esperados, las validaciones con Joi y las salidas de posibles errores con Boom, estamos listos para requerir y registrar nuestro plugin en el script principal de nuestra aplicación.

Adicionalmente, modificaremos la función fileNotFound(...) en el controlador de sitio para evitar que los errores 404 de nuestra API, se visualicen a través de la vista y en cambio lo hagan con JSON que es la salida por defecto.

Aportes 6

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

para quienes les de error en la validación con joi deben agruparlo en un objeto de la siguiente manera:

options: {
    validate: {
        params: joi.object({
            amount: joi.number().integer().min(1).max(20)
              .required(),
        }),
        failAction: failValidation,
    },
},

de igual forma para la otra ruta del api

Estupenda clase instructor, no tenía idea que dé con este método se podría construir un API REST. Por cierto, pude hacerla funcionar siguiendo el consejo que escribió gorydev respecto a crear joi.object y colocar failAction después de params:

No sabía que es tan fácil crear un API REST con hapi… estoy impresionado

'use strict'

const Joi = require('joi')
const questions = require('../models/index').questions
const Boom = require('boom')

module.exports = {
    name: 'api-rest',
    version: '1.0.0',
    async register (server, options) {
        const prefix = options.prefix || 'api'

        server.route({
            method: 'GET',
            path: `/${prefix}/question/{key}`,
            options: {
                validate: {
                    params: {
                        key: Joi.string().required()
                    },
                    failAction: failValidation
                }
            },
            handler: async (req, h) => {
                let result
                try {
                    result = await questions.getOne(req.params.key)
                    if (!result) {
                        return Boom.notFound(`No se pudo encontrar la pregunta ${req.params.key}`)
                    }
                } catch (error) {
                    return Boom.badImplementation(`Hubo error buscando ${req.params.key} - ${error}`)   
                }
                return result
            }
        })

        server.route({
            method: 'GET',
            path: `/${prefix}/questions/{amount}`,
            options: {
                validate: {
                    params: {
                        amount: Joi.number().integer().min(1).max(20).required()
                    },
                    failAction: failValidation
                }
            },
            handler: async (req, h) => {
                let result
                try {
                    result = await questions.getLast(req.params.amount)
                    if (!result) {
                        return Boom.notFound(`No se pudo requperar las preguntas`)
                    }
                } catch (error) {
                    return Boom.badImplementation(`Hubo error buscando las preguntas - ${error}`)   
                }
                return result
            }
        })

        function failValidation (req, h, err) {
            return Boom.badRequest('Por favor use los paramtros correctos')
        }
    }
}

Que maravilla la creación de apis con hapi!!!

Que belleza es crear una api con Hapi 😄