# Primeros pasos

# Conceptos en Hapi

# Server

El objeto del servidor es el contenedor principal de la aplicación. El servidor gestiona todas las solicitudes entrantes junto con todas las facilidades proporcionadas por el marco. Cada servidor admite una única conexión (por ejemplo, escuchar el puerto 80).

const Hapi = require('hapi')

const server = Hapi.server({
    port: 80,
    host: '0.0.0.0',
    routes: {
        cors: true
    }
})

# Server.route(route)

Un Endpoint o punto final de API es el destino de la API solicitada por el propietario de un sitio web. Si un sistema de administración de contenido (CMS) solicita acceso a una API, el CMS sirve como punto final de la API.

En Hapi los endpoints se definen como un objeto de configuración de ruta o una matriz de objetos de configuración donde cada objeto contiene:

  • route: (obligatorio) la ruta absoluta utilizada para hacer coincidir las solicitudes entrantes (debe comenzar con '/'). Las solicitudes entrantes se comparan con las rutas configuradas según la configuración del enrutador del servidor. La ruta puede incluir parámetros con nombre encerrados en {} que se compararán con los valores literales en la solicitud como se describe en los parámetros de la ruta.

  • method: (obligatorio) el método HTTP.

  • handler: (requerido cuando el manejador no está configurado), se llamó a la función del manejador de ruta para generar la respuesta después de una autenticación y validación exitosas.

  • options: opciones de ruta adicionales. El valor de las opciones puede ser un objeto o una función que devuelve un objeto utilizando la función de firma (servidor) donde server es el servidor al que se agrega la ruta y esto está vinculado a la opción de enlace del reino actual.

server.route({ 
        method: 'GET', 
        path: '/status', 
        handler: () => 'ok' 
    });

# Request

Es la petición realizada al servidor.

# Payload

En express es el equivalente al body

Cada vez que envíe datos de solicitud a su API, podrá acceder a estos datos en el controlador de ruta con request.payload

server.route({
    method: 'POST',
    path: '/signup',
    handler: function (request, h) {
        const payload = request.payload;
        return `Welcome ${payload.username}!`;
    }
});

# Handler

La función que se ejecuta en cada endpoint al ser consumido.

En express es el equivalente al middleware

La opción de handler es una función que acepta dos parámetros, request y h.

# Objeto H

Es el kit de herramientas de respuesta, un objeto con varios métodos utilizados para responder a la solicitud. Como ha visto en los ejemplos anteriores, si desea responder a una solicitud con algún valor, simplemente devuélvala desde el controlador. La carga útil puede ser una cadena, un búfer, un objeto serializable JSON, una secuencia o una promesa.

# Plugin

Hapi tiene un extenso y poderoso sistema de complementos que le permite dividir fácilmente su aplicación en partes aisladas de lógica de negocios y utilidades reutilizables. Puede agregar un complemento existente a su aplicación o crear uno propio.

# Primer server con Hapi

const Hapi = require("hapi")

const server = Hapi.server({
    port: 3000,
    host: 'localhost'
})

async function init () {

    server.route({
        method: 'GET',
        path: '/',
        handler: (req, h) => {
            return h.response('Hola Mundo!').code(200)
        }
    })

    server.route({
        method: 'GET',
        path: '/redirect',
        handler: (req, h) => {
            return h.redirect('http://google.com')
        }
    })
    //CONTROLAMOS EL ERROR 
    try {
        await server.start()
    } catch(error){
        console.error(error)
        proccess.exit(1)
    }
    console.log(`Servidor lanzado en: ${server.info.uri} `)
}

init()