DENO
Instalación y documentación
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:
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
Crear la Base de datos (para este caso en MySQL)
Instalar MySQL
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.
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