Aprendiendo Deno

 DENO



Responsable

Modificación

Fecha

Versión

Jaime Téllez

Se inicia documento de Deno

17/01/2021

1.0.0



Instalación y documentación 

https://deno.land/


seguir las instrucciones dependiendo del SO:

https://deno.land/#installation


Comando para ver la versión actual 

Versión actual: 1.6.3


deno --version


Después de la instalación en MAC, se debe agregar variables de entorno:

jaimetellez@ ~ % curl -fsSL https://deno.land/x/install/install.sh | sh

######################################################################## 100.0% -#O#-  #   #                                                             

Archive:  /Users/jaimetellez/.deno/bin/deno.zip

  inflating: /Users/jaimetellez/.deno/bin/deno  

Deno was installed successfully to /Users/jaimetellez/.deno/bin/deno

Manually add the directory to your $HOME/.zshrc (or similar)

  export DENO_INSTALL="/Users/jaimetellez/.deno"

  export PATH="$DENO_INSTALL/bin:$PATH"

Run '/Users/jaimetellez/.deno/bin/deno --help' to get started



Ejecutar archivos ts en Deno

deno run archivo.ts


Una de las cosas que trae Deno es que para ejecutar archivos dentro del SO necesita permisos, por ejemplo:


al ejecutar deno run index.ts sale el siguiente error:


Check file:///Users/jaimetellez/Documents/tellez/repositorio/estudio/deno/rest-api-mysql/index.ts

error: Uncaught PermissionDenied: network access to "0.0.0.0:8000", run again with the --allow-net flag

at processResponse (deno:core/core.js:223:11)

at Object.jsonOpSync (deno:core/core.js:246:12)

at opListen (deno:runtime/js/30_net.js:28:17)

at Object.listen (deno:runtime/js/30_net.js:191:17)

at Application.serve (server.ts:301:25)

at Application.listen (application.ts:362:20)

at index.ts:9:11


incluso en el error nos dice la solución y las opciones que debemos agregar para que se ejecute correctamente:


deno run --allow-net index.ts


En visual Studio debe agregarse el plugin de Deno:

https://marketplace.visualstudio.com/items?itemName=denoland.vscode-deno


Para que funcione correctamente debe agregarse configuración en el archivo settings.json, para evitar que esto afecte todos los repositorios que se abren con vscode, se debe crear una carpeta: 

.vscode y dentro el archivo settings.json, con la siguiente configuración:


{

 "deno.enable": true,

 "[typescript]": {

   "editor.defaultFormatter": "denoland.vscode-deno"

 },

 "[typescriptreact]": {

   "editor.defaultFormatter": "denoland.vscode-deno"

 },

 "deno.lint": true

}






Crear Servidor con Deno

Se pueden utilizar librerías que están hechas para Deno y se encuentran en el siguiente enlace:


https://deno.land/x

Son módulos que van creando la comunidad.



index.ts


import { Application } from "https://deno.land/x/oak/mod.ts";

 

const app = new Application();

 

app.use((ctx) => {

 ctx.response.body = "Hello World!";

});

 

await app.listen({ port: 3000 });


Esto hace que Deno exponga un servidor que escucha por el puerto 3000.

Ingresamos a un navegador y escribimos la url: http://localhost:3000.


Resultado:



Crear REST API con Deno


  1. Crear la Base de datos (para este caso en MySQL)


  • Instalar MySQL



  1. Crear estructura de proyecto en vscode

crear directorio /database para agregar el archivo database.sql y colocar el script de la base de datos

CREATE DATABASE dbusers;

USE dbusers;

 

CREATE TABLE user (

 id INT(11) NOT NULL AUTO_INCREMENT,

 name VARCHAR(100) NOT NULL,

 country VARCHAR(50) NOT NULL,

 created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

 PRIMARY KEY id

);

 

INSERT INTO user(name, country) VALUES ('Ryan Ray', 'USA'), ('Joe McMillan', 'USA');


agregar el directorio src/ y dentro los siguientes archivos:

index.ts -> Es el archivo donde se configura el servidor con la librería de Oak.

https://deno.land/x/oak@v6.4.1


import { Application } from "https://deno.land/x/oak/mod.ts";

import router from "./routes.ts";

 

const app = new Application();

 

app.use(router.routes());

app.use(router.allowedMethods());

 

await app.listen({ port: 3000 });



routes.ts -> Se colocan las rutas de los recursos que se van a exponer en el API

import { Router } from "https://deno.land/x/oak/mod.ts";

import { addUser } from "./handlers/addUser.ts";

import { deleteUser } from "./handlers/deleteUser.ts";

import { getAllUsers } from "./handlers/getAllUsers.ts";

import { getUser } from "./handlers/getUser.ts";

import { updateUser } from "./handlers/updateUser.ts";

 

const router = new Router();

 

router

 .get("/", (ctx) => {

   ctx.response.body = "Hello world!";

 })

 .get("/users/1", getUser)

 .get("/users", getAllUsers)

 .post("/users", addUser)

 .put("/users", updateUser)

 .delete("/users", deleteUser);

 

export default router;


db.ts -> Configuración de la base de datos MySQL

import { Client } from "https://deno.land/x/mysql/mod.ts";

 

const client = await new Client().connect({

 hostname: "127.0.0.1",

 username: "deno",

 db: "dbusers",

 password: "",

});

 

export default client;



crear directorio /handlers y dentro las diferentes funcionalidades:

getAllUsers.ts -> Servicio que obtiene todos los registros de la tabla user.

import client from "../db.ts";

export async function getAllUsers(ctx: any) {

 try {

   const res = await client.query("select * from user");

   console.log("Users:", res);

   ctx.response.body = "Hello world users";

 } catch (error) {

   console.log("ERROR:", error);

 }

}

 

 


Se están presentando los errores que se ven en la parte de “ERRORES” más adelante.



  1. Instalar módulos en Deno

ejecutar el comando deno install https://deno.land/x/oak@v6.4.1






ERRORES


ERROR: Error: Got packets out of order

at PoolConnection.nextPacket (connection.ts:143:13)

at async PoolConnection.execute (connection.ts:221:21)

at async PoolConnection.query (connection.ts:197:20)

at async client.ts:86:14

at async Client.useConnection (client.ts:107:14)

at async Client.query (client.ts:85:12)

at async getAllUsers (getAllUsers.ts:5:17)

at async dispatch (middleware.ts:41:7)

at async dispatch (middleware.ts:41:7)

at async dispatch (middleware.ts:41:7)


ERROR: Error: Not supported

at auth (auth.ts:45:13)

at buildAuth (auth.ts:34:24)

at PoolConnection._connect (connection.ts:72:20)

at async PoolConnection.connect (connection.ts:106:5)

at async Client.createConnection (client.ts:47:5)

at async DeferredStack.creator (pool.ts:61:20)

at async DeferredStack.pop (deferred.ts:35:16)

at async ConnectionPool.pop (pool.ts:93:14) 

at async Client.useConnection (client.ts:105:24)

at async Client.execute (client.ts:96:12)


Los errores se presentan por la versión de mysql que aún no soporta el módulo de Deno https://deno.land/x/mysql@v2.7.0.

versión Actual MySQL: 8.x

Versión que funciona MySQL: 5.x


Sin comentarios