Tomas Duclos

Deno create rest api with Hono

Deno create rest api with Hono

27 Junio 2023

Deno es un runtime para JavaScript/TypeScript basado en el motor V8 de chrome escrito en rust el cual busca ser una alternativa mas rapida que NodeJS ya que son del mismo creador Ryan Dahl

Requisitos

La version de Deno que estaremos utilizando sera la 1.34.3, Para verificar la version que tienes actualmente en una terminal escriba lo siguiente

deno --version

Creamos una carpeta en mi caso la llamare deno_rest_api_demo, luego procedemos a abrirla con el Visual Studio Code. Lo primero que tendremos que hacer es instalar una extension llamada Deno (https://marketplace.visualstudio.com/items?itemName=denoland.vscode-deno), lo que hace esta extension es cambiar el entorno de desarrollo del editor, mas adelante haremos unas comparaciones para ver de que sirve.

command palette

Abrimos el ‘Command Palette’ del editor

deno initialize

Buscamos ‘Deno: Initialize Workspace Configuration’, este comando aparecera gracias a la extension que instalamos previamente, al ejecutarlo nos hara 2 preguntas.

deno linting

‘Enable Deno Linting?’: es el equivalente al eslint en NodeJS formateara el codigo dependiendo de la configuracion, le daremos que si

deno unstable api

‘Enable Deno unstable APIs?’: Nos dara autocompletado de las apis que no son estables para produccion, en este demo como no estaremos experimentando con las nuevas apis de deno, le daremos que no.

Ahora se nos generara tendremos una carpeta llamada .vscode, dentro habra un archivo settings.json con las configuraciones que hizimos el cual la pueden modificar si lo necesitan.

Procedemos a crear la carpeta ‘src’ que va a contener todo el codigo que vamos a ir escribiendo y creamos nuestro archivo ‘index.js’

// src/index.js
console.log('Hello world')

Para arrancar el archivo tenemos que abrir una terminal, ubicarnos en el directorio del proyecto y escribir lo siguiente.

deno run src/index.js

hara un console.log de ‘Hello world’, ahora lo que vamos hacer es crear nuestro servidor http, vamos a utilizar una modulo oficial de deno llamado ‘http’ https://deno.land/std@0.192.0/http/server.ts, los modulos en deno son urls de internet a comparacion de NodeJS que cada uno tiene su propio nombre. Vamos a importar el modulo de la siguiente forma

// src/index.js
import { serve } from 'https://deno.land/std@0.192.0/http/server.ts'

deno import http

Si te da error el import, no te preocupes esta todo bien!, deno te esta pidiendo que descarges los archivos del modulo para que tengas el autocompletado, para descargarlo tienes que pasar el mouse sobre la url del modulo y te abrira una tarjeta como se muestra en la imagen, tienes que hacerle click en ‘Quick fix…’, luego saldran 2 opciones y le das click en ‘Cache “URL” and its dependencies.’. Con eso deberia irse el error y tener el autocompletado, continuemos con la creacion de nuestro servidor

// src/index.js
import { serve } from 'https://deno.land/std@0.192.0/http/server.ts'

const PORT = 4000

serve(
  () => {
    return new Response(
      '<h1>Hello world</h1>',
      {
        headers: {
          'Content-Type': 'text/html'
        }
      }
    )
  },
  {
    port: PORT,
    onListen: () => console.log(`SV ON PORT ${PORT}`)
  }
)

Creamos una variable llamada PORT por su mismo nombre sera el numero del puerto que tendra el servidor, luego invocamos la funcion serve(), como primer parametro recibe un callback o funcion que tiene que retornar una instancia de la clase new Response se invocara cada vez que el usuario visite la url, en este caso le devolveremos un html al cliente, como segundo parametro recibe un objeto con las configuraciones, el puerto y el evento onListen que se ejecutara cuando el servidor ya este listo

Procedemos a ejecutar nuestro programa escribiendo

deno run src/index.js

deno allow net

Deno nos esta pidiendo un permiso de que necesita conectarse a internet para que nuestro proyecto funcione, presionamos la Y para decirle que si y apretamos enter.

ahora nos dira ‘SV ON PORT 4000’ eso indica que nuestro servidor esta funcionando, abrimos nuestro navegador y visitamos al http://localhost:4000.

Ahora hay un pequeno problema que si editamos el codigo y guardamos, nuestro servidor no se reiniciara persistiendo con el codigo anterior, para eso tenemos que parar el programa con ctrl + c y escribir

deno run --watch src/index.js

Nos volvera a pedir el mismo permiso, le daremos que si y arrancara el servidor. Si vuelves hacer un cambio en el codigo y guardas el programa se volvera a reiniciar, volvera a pedirte el mismo permiso, si deseas que no vuelva a pedir el permiso cada vez que se ejecute el programa tienes que agregarle un flag al comando.

Si te fijas aqui esta el flag: —allow-net y se lo tienes que agregar al comando de ejecucion, quedaria de esta forma

deno run --allow-net --watch src/index.js

ahora si haces un cambio y guardas, el programa se reiniciara sin pedir los permisos ya que se lo permitiste en el comando con el flag

Si quieres ejecutar el programa con un unico comando como en NodeJS ‘npm run start o npm run dev’, porque a medida que el proyecto vaya escalando es mas probable que deno te pida cada vez mas permisos. Como en NodeJS existe el package.json en Deno su equivalente es deno.json, entonce procedemos a crear ese archivo en la carpeta raiz

deno json

// deno.json
{
  "tasks": {
    "dev": "deno run --allow-net --watch src/index.js"
  }
}