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?

o inicia sesi贸n.

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 馃槃