Ponte en marcha rápidamente con Deno, una alternativa moderna a Node.js
Exploro nuevos proyectos cada semana y es raro que alguno llame mi atención tanto como lo hizo Deno.
¿Qué es Deno?
Si conoces Node.js, el popular ecosistema de JavaScript del lado del servidor, entonces Deno es como Node, excepto que ha sido mejorado profundamente en muchos aspectos.
Comenzamos con una lista rápida de las características que más me gustan de Deno:
- Se basa en características modernas del lenguaje JavaScript.
- Tiene una amplia biblioteca estándar.
- Tiene TypeScript en su núcleo, lo que aporta una gran ventaja en muchos sentidos diferentes, incluido un soporte de TypeScript de primera clase (no es necesario compilar TypeScript por separado, Deno lo hace automáticamente).
- Abarca módulos ES
- No tiene gestor de paquetes
- Tiene una calidad de primera
await
- Tiene una instalación de prueba incorporada.
- Su objetivo es ser compatible con el navegador tanto como sea posible, por ejemplo, proporcionando un objeto integrado
fetch
y global.window
Exploraremos todas esas características en esta guía.
Después de usar Deno y aprender a apreciar sus características, Node.js parecerá algo antiguo.
Especialmente porque la API de Node.js se basa en devoluciones de llamadas, ya que se escribió mucho antes de las promesas y async/await. No hay cambios implementados para eso en Node, ya que un cambio de ese tipo sería monumental, por lo que estamos limitados a las devoluciones de llamadas oa las llamadas a la API que prometen.
Node.js es fantástico y seguirá siendo el estándar de facto en el mundo de JavaScript, pero creo que gradualmente veremos que Deno se adopta cada vez más debido a su compatibilidad de primera clase con TypeScript y su biblioteca estándar moderna.
Deno puede permitirse el lujo de tener todo escrito con tecnologías modernas, ya que no hay compatibilidad con versiones anteriores que mantener. Por supuesto, no hay garantía de que en una década ocurra lo mismo con Deno y surja una nueva tecnología, pero esa es la realidad en este momento.
¿Por qué Deno? ¿Por qué ahora?
Deno fue anunciado hace casi 2 años por el creador original de Node.js, Ryan Dahl, en JSConf EU. Mira el video de YouTube de la charla, es muy interesante y es una visita obligada si estás involucrado con Node.js y JavaScript en general.
Todo director de proyecto debe tomar decisiones. Ryan lamentó algunas de las primeras decisiones que tomó en Node. Además, la tecnología evoluciona y hoy JavaScript es un lenguaje totalmente diferente de lo que era en 2009, cuando comenzó Node. Piense en las características modernas de ES6/2016/2017, etc.
Entonces comenzó un nuevo proyecto para crear una especie de segunda ola de aplicaciones del lado del servidor impulsadas por JavaScript.
La razón por la que estoy escribiendo esta guía ahora y no en aquel entonces es porque las tecnologías necesitan mucho tiempo para madurar. Y finalmente hemos llegado a Deno 1.0 (la versión 1.0 debería lanzarse el 13 de mayo de 2020), la primera versión de Deno declarada oficialmente estable.
Puede que parezca solo un número, pero 1.0 significa que no habrá cambios importantes hasta Deno 2.0, lo cual es muy importante cuando te sumerge en una nueva tecnología: no quieres aprender algo y que luego cambie demasiado rápido.
¿Deberías aprender Deno?
Esa es una gran pregunta.
Aprender algo nuevo como Deno es un gran esfuerzo. Mi sugerencia es que si estás empezando ahora con JS del lado del servidor y aún no conoces Node, y nunca escribiste nada con TypeScript, comienzas con Node.
Nadie fue despedido nunca por elegir Node.js (parafraseando una cita común).
Pero si te encanta TypeScript, no depende de un montón de paquetes npm en tus proyectos y quieres usarlo await
en cualquier lugar, entonces Deno podría ser lo que estás buscando.
¿Reemplazarás a Node.js?
No. Node.js es una tecnología gigante, bien establecida y con un excelente soporte que se mantendrá durante décadas.
Compatibilidad con TypeScript de primera clase
Deno está escrito en Rust y TypeScript, dos de los lenguajes que hoy en día están creciendo realmente rápido.
En particular, estar escrito en TypeScript significa que obtenemos muchos de los beneficios de TypeScript incluso si recomendamos escribir nuestro código en JavaScript simple.
Y ejecutar código TypeScript con Deno no requiere un paso de compilación: Deno lo hace automáticamente por usted.
No estás obligado a escribir en TypeScript, pero el hecho de que el núcleo de Deno esté escrito en TypeScript es enorme.
En primer lugar, un porcentaje cada vez mayor de programadores de JavaScript adoran TypeScript.
En segundo lugar, las herramientas que utilizan pueden inferir mucha información sobre el software escrito en TypeScript, como Deno.
Esto significa que mientras codificamos en VS Code, por ejemplo, que obviamente tiene una integración estrecha con TypeScript ya que ambos se desarrollan en Microsoft, podemos obtener beneficios como la verificación de tipos mientras escribimos nuestro código y funciones avanzadas de IntelliSense. En otras palabras, el editor puede ayudarnos de una manera muy útil.
Similitudes y diferencias con Node.js
Dado que Deno es básicamente un reemplazo de Node.js, es útil comparar los dos directamente.
Similitudes:
- Ambos están desarrollados sobre el motor V8 Chromium.
- Ambos son excelentes para desarrollar el lado del servidor con JavaScript.
Diferencias:
- Node está escrito en C++ y JavaScript. Deno está escrito en Rust y TypeScript.
- Node tiene un administrador de paquetes oficial llamado
npm
. Deno no lo tiene y, en su lugar, permite importar cualquier módulo ES desde URL. - Node utiliza la sintaxis CommonJS para importar paquetes. Deno utiliza módulos ES, la forma oficial.
- Deno utiliza características modernas de ECMAScript en todas sus API y biblioteca estándar, mientras que Node.js utiliza una biblioteca estándar basada en devoluciones de llamadas y no tiene planes de actualizarla.
- Deno ofrece una capa de seguridad de sandbox a través de permisos. Un programa solo puede acceder a los permisos establecidos para el ejecutable como indicadores por el usuario. Un programa Node.js puede acceder a todo lo que el usuario pueda acceder.
- Deno lleva mucho tiempo considerando la posibilidad de compilar un programa en un ejecutable que se pueda ejecutar sin dependencias externas, como Go, pero todavía no es una posibilidad. Eso sería un cambio radical.
Sin gestor de paquetes
No tener un gestor de paquetes y tener que depender de URL para alojar e importar paquetes tiene sus pros y sus contras. Me gustan muchas las ventajas: es muy flexible, podemos crear paquetes sin publicarlos en un repositorio como npm.
Creo que surgirá algún tipo de administrador de paquetes, pero aún no hay nada oficial.
El sitio web de Deno proporciona alojamiento de código (y, por lo tanto, distribución a través de URL) a paquetes de terceros: https://deno.land/x/
Instalar Deno
¡Basta de hablar! Vamos a instalar Deno.
La forma más fácil es utilizar Homebrew:
brew install deno
Una vez hecho esto, tendrás acceso al deno
comando. Aquí tienes la ayuda que puedes obtener usando deno --help
:
flavio@mbp~ deno --helpdeno 0.42.0A secure JavaScript and TypeScript runtimeDocs: https://deno.land/std/manual.mdModules: https://deno.land/std/ https://deno.land/x/Bugs: https://github.com/denoland/deno/issuesTo start the REPL, supply no arguments: denoTo execute a script: deno run https://deno.land/std/examples/welcome.ts deno https://deno.land/std/examples/welcome.tsTo evaluate code in the shell: deno eval "console.log(30933 + 404)"Run 'deno help run' for 'run'-specific flags.USAGE: deno [OPTIONS] [SUBCOMMAND]OPTIONS: -h, --help Prints help information -L, --log-level log-level Set log level [possible values: debug, info] -q, --quiet Suppress diagnostic output By default, subcommands print human-readable diagnostic messages to stderr. If the flag is set, restrict these messages to errors. -V, --version Prints version informationSUBCOMMANDS: bundle Bundle module and dependencies into single file cache Cache the dependencies completions Generate shell completions doc Show documentation for a module eval Eval script fmt Format source files help Prints this message or the help of the given subcommand(s) info Show info about cache or info related to source file install Install script as an executable repl Read Eval Print Loop run Run a program given a filename or url to the module test Run tests types Print runtime TypeScript declarations upgrade Upgrade deno executable to newest versionENVIRONMENT VARIABLES: DENO_DIR Set deno's base directory (defaults to $HOME/.deno) DENO_INSTALL_ROOT Set deno install's output directory (defaults to $HOME/.deno/bin) NO_COLOR Set to disable color HTTP_PROXY Proxy address for HTTP requests (module downloads, fetch) HTTPS_PROXY Same but for HTTPS
Los comandos de Deno
Observe la SUBCOMMANDS
sección de ayuda que enumera todos los comandos que podemos ejecutar. ¿Qué subcomandos tenemos?
bundle
Agrupar módulos y dependencias de un proyecto en un solo archivocache
almacenar en caché las dependenciascompletions
generar terminaciones de shelldoc
mostrar documentación de un móduloeval
para evaluar un fragmento de código, por ejemplodeno eval "console.log(1 + 2)"
fmt
un formateador de código incorporado (similar algofmt
de Go)help
Imprime este mensaje o la ayuda del subcomando(s) indicado(s)info
Mostrar información sobre el caché o información relacionada con el archivo de origeninstall
Instalar script como ejecutablerepl
Lectura-evaluación-impresión-bucle (predeterminado)run
Ejecutar un programa dado un nombre de archivo o URL al módulotest
ejecutar pruebastypes
Declaraciones TypeScript en tiempo de ejecución de impresiónupgrade
Actualizardeno
a la versión más nueva
Puede ejecutar deno subcommand help
para obtener documentación adicional específica para el comando, por ejemplo deno run --help
.
Como dice la ayuda, podemos usar este comando para iniciar un REPL (Read-Execute-Print-Loop) deno
sin ninguna otra opción.
Esto es lo mismo que correr deno repl
.
Una forma más común de utilizar este comando es ejecutar una aplicación Deno contenida en un archivo TypeScript.
Puede ejecutar .ts
archivos TypeScript ( ) o .js
archivos JavaScript ( ).
Si no está familiarizado con TypeScript, no se preocupe: Deno está escrito en TypeScript, pero puede escribir sus aplicaciones “cliente” en JavaScript.
Mi tutorial de TypeScript te ayudará a comenzar a trabajar rápidamente con TypeScript si lo deseas.
Tu primera aplicación Deno
Ejecutemos una aplicación Deno por primera vez.
Lo que me parece sorprendente es que ni siquiera tienes que escribir una sola línea: puedes ejecutar un comando desde cualquier URL.
Deno descarga el programa, lo compila y luego lo ejecuta:
Por supuesto, ejecutar código arbitrario desde Internet no es una práctica generalmente recomendable. En este caso, lo estamos ejecutando desde el sitio oficial de Deno, además de que Deno tiene un entorno limitado que evita que los programas hagan algo que no desea permitir. Más sobre esto más adelante.
Este programa es muy sencillo, solo una console.log()
llamada:
console.log('Welcome to Deno ')
Si abre la URL https://deno.land/std/examples/welcome.ts con el navegador, verá esta página:
Es extraño, ¿verdad? Probablemente esperarías un archivo TypeScript, pero en lugar de eso tenemos una página web. La razón es que el servidor web del sitio web de Deno sabe que estás usando un navegador y te ofrece una página más fácil de usar.
Descargue el mismo UR usando wget
por ejemplo, que solicita la text/plain
versión del mismo en lugar de text/html
:
Si desea ejecutar el programa nuevamente, ahora está almacenado en caché por Deno y no es necesario descargarlo nuevamente:
Puedes forzar una recarga de la fuente original con la --reload
bandera:
deno run
Tiene muchas opciones diferentes que no se enumeraron en el deno --help
. En su lugar, debe ejecutar deno run --help
para revelarlas:
flavio@mbp~ deno run --helpdeno-runRun a program given a filename or url to the module.By default all programs are run in sandbox without access to disk, network orability to spawn subprocesses. deno run https://deno.land/std/examples/welcome.tsGrant all permissions: deno run -A https://deno.land/std/http/file_server.tsGrant permission to read from disk and listen to network: deno run --allow-read --allow-net https://deno.land/std/http/file_server.tsGrant permission to read whitelisted files from disk: deno run --allow-read=/etc https://deno.land/std/http/file_server.tsUSAGE: deno run [OPTIONS] SCRIPT_ARG...OPTIONS: -A, --allow-all Allow all permissions --allow-env Allow environment access --allow-hrtime Allow high resolution time measurement --allow-net=allow-net Allow network access --allow-plugin Allow loading plugins --allow-read=allow-read Allow file system read access --allow-run Allow running subprocesses --allow-write=allow-write Allow file system write access --cached-only Require that remote dependencies are already cached --cert FILE Load certificate authority from PEM encoded file -c, --config FILE Load tsconfig.json configuration file -h, --help Prints help information --importmap FILE UNSTABLE: Load import map file Docs: https://deno.land/std/manual.md#import-maps Specification: https://wicg.github.io/import-maps/ Examples: https://github.com/WICG/import-maps#the-import-map --inspect=HOST:PORT activate inspector on host:port (default: 127.0.0.1:9229) --inspect-brk=HOST:PORT activate inspector on host:port and break at start of user script --lock FILE Check the specified lock file --lock-write Write lock file. Use with --lock. -L, --log-level log-level Set log level [possible values: debug, info] --no-remote Do not resolve remote modules -q, --quiet Suppress diagnostic output By default, subcommands print human-readable diagnostic messages to stderr. If the flag is set, restrict these messages to errors. -r, --reload=CACHE_BLACKLIST Reload source code cache (recompile TypeScript) --reload Reload everything --reload=https://deno.land/std Reload only standard modules --reload=https://deno.land/std/fs/utils.ts,https://deno.land/std/fmt/colors.ts Reloads specific modules --seed NUMBER Seed Math.random() --unstable Enable unstable APIs --v8-flags=v8-flags Set V8 command line options. For help: --v8-flags=--helpARGS: SCRIPT_ARG... script args
Ejemplos de código de Deno
Además del que ejecutamos anteriormente, el sitio web de Deno proporciona otros ejemplos que puedes consultar: https://deno.land/std/examples/ .Te recomendamos Aprender a programar con ejemplos
Al momento de escribir estas líneas podemos encontrar:
cat.ts
Imprima el contenido de una lista de archivos proporcionados como argumentos.catj.ts
Imprima el contenido de una lista de archivos proporcionados como argumentos.chat/
una implementación de un chatcolors.ts
Un ejemplo decurl.ts
Una implementación sencillacurl
que imprime el contenido de la URL especificada como argumento.echo_server.ts
un servidor eco TCPgist.ts
un programa para publicar archivos en gist.github.comtest.ts
un conjunto de pruebas de muestrawelcome.ts
Una declaración console.log simple (el primer programa que ejecutamos arriba)xeval.ts
permite ejecutar cualquier código TypeScript para cualquier línea de entrada estándar recibida. Antes se conoció comodeno xeval
pero se eliminó del comando oficial.
Tu primera aplicación Deno (de verdad)
Vamos a escribir algo de código.
La primera aplicación Deno que ejecutaste deno run https://deno.land/std/examples/welcome.ts
fue una aplicación que otra persona escribió, por lo que no viste nada con respecto a cómo se ve el código Deno.
Comenzaremos con la aplicación de ejemplo predeterminada que aparece en el sitio web oficial de Deno:
import { serve } from 'https://deno.land/std/http/server.ts'const s = serve({ port: 8000 })console.log('https://localhost:8000/')for await (const req of s) { req.respond({ body: 'Hello Worldn' })}
Este código importa la serve
función del http/server
módulo. ¿Ves? No tenemos que instalarla primero y tampoco se almacena en tu máquina local como sucede con los módulos de Node. Esta es una de las razones por las que la instalación de Deno fue tan rápida.
Al importar desde https://deno.land/std/http/server.ts
se importa la última versión del módulo. Puedes importar una versión específica usando @VERSION
, de la siguiente manera:
import { serve } from 'https://deno.land/[email protected]/http/server.ts'
La serve
función se define así en este archivo:
/** * Create a HTTP server * * import { serve } from "https://deno.land/std/http/server.ts"; * const body = "Hello Worldn"; * const s = serve({ port: 8000 }); * for await (const req of s) { * req.respond({ body }); * } */export function serve(addr: string | HTTPOptions): Server { if (typeof addr === 'string') { const [hostname, port] = addr.split(':') addr = { hostname, port: Number(port) } } const listener = listen(addr) return new Server(listener)}
Procedemos a instanciar un servidor llamando a la serve()
función pasando un objeto con la port
propiedad.
Luego ejecutamos este bucle para responder a cada solicitud que viene del servidor.
for await (const req of s) { req.respond({ body: 'Hello Worldn' })}
Tenga en cuenta que usamos la await
palabra clave sin tener que envolverla en una async
función porque Deno implementa await de nivel superior.
Ejecutemos este programa localmente. Supongo que utiliza VS Code, pero puede utilizar cualquier editor que desee.
Recomiendo instalar la extensión Deno desde justjavac
(había otra con el mismo nombre cuando la probé, pero estaba obsoleta; podría desaparecer en el futuro)
La extensión proporcionará varias utilidades y cosas interesantes a VS Code para ayudarte a escribir tus aplicaciones.
Ahora crea un app.ts
archivo en una carpeta y pega el código anterior:
Ahora ejecútalo usando deno run app.ts
:
Deno descarga todas las dependencias que necesita, descargando primero la que importamos.
El archivo https://deno.land/std/http/server.ts tiene varias dependencias propias:
import { encode } from '../encoding/utf8.ts'import { BufReader, BufWriter } from '../io/bufio.ts'import { assert } from '../testing/asserts.ts'import { deferred, Deferred, MuxAsyncIterator } from '../async/mod.ts'import { bodyReader, chunkedBodyReader, emptyReader, writeResponse, readRequest,} from './_io.ts'import Listener = Deno.Listenerimport Conn = Deno.Connimport Reader = Deno.Reader
y estos se importan automáticamente.
Pero al final tenemos un problema:
¿Qué está pasando? Tenemos un problema de permiso denegado.
Hablemos del sandbox.
El sandbox de Deno
Mencioné anteriormente que Deno tiene una zona protegida que evita que los programas hagan algo que no quieres permitir.
¿Qué quiere decir esto?
Una de las cosas que Ryan menciona en la charla introductoria de Deno es que a veces quieres ejecutar un programa JavaScript fuera del navegador web, pero no le permites acceder a nada de lo que quiere en tu sistema o comunicarse con el mundo exterior a través de una red.
No hay nada que impida que una aplicación Node.js obtenga tus claves SSH o cualquier otra cosa en tu sistema y la envíe a un servidor. Por eso, normalmente solo instalamos paquetes Node de fuentes confiables, pero ¿cómo podemos saber si uno de los proyectos que usamos es atacado y, a su vez, todos los demás lo son?
Deno intenta replicar el mismo modelo de permisos que implementa el navegador. Ningún código JavaScript que se ejecute en el navegador puede hacer cosas sospechosas en su sistema a menos que usted lo permita explícitamente.
Volviendo a Deno, si un programa quiere acceder a la red como en el caso anterior, entonces necesitamos darle permiso.
Podemos hacerlo pasando una bandera cuando ejecutamos el comando, en este caso --allow-net
:
deno run --allow-net app.ts
La aplicación ahora está ejecutando un servidor HTTP en el puerto 8000:
Otras banderas permiten a Deno desbloquear otras funcionalidades:
--allow-env
permitir el acceso al entorno--allow-hrtime
Permite la medición del tiempo con alta resolución--allow-net=allow-net
permitir el acceso a la red--allow-plugin
permitir cargar complementos--allow-read=allow-read
permitir acceso de lectura al sistema de archivos--allow-run
permitir la ejecución de subprocesos--allow-write=allow-write
permitir acceso de escritura al sistema de archivos--allow-all
permitir todos los permisos (igual que-A
)
Los permisos para net
y read
pueden write
ser granulares. Por ejemplo, puede permitir la lectura desde una carpeta específica utilizando--allow-read=/dev
Código de formato
Una de las cosas que más me gustó de Go fue el gofmt
comando que venía con el compilador de Go. Todo el código de Go se ve igual. Todos usan gofmt
.
Los programadores de JavaScript están acostumbrados a ejecutar Prettier y, deno fmt
de hecho, lo ejecutan bajo la apariencia de algo real.
Digamos que tienes un archivo mal formateado como éste:
Lo ejecutas deno fmt app.ts
y se formatea automáticamente de forma correcta, agregando también punto y coma donde falta:
La biblioteca estándar
La biblioteca estándar de Deno es extensa a pesar de que el proyecto es muy joven.
Incluye:
archive
utilidades del archivo tarasync
utilidades asincrónicasbytes
Ayudantes para manipular porciones de bytesdatetime
análisis de fecha y horaencoding
codificación/decodificación para varios formatosflags
Analizar indicadores de línea de comandosfmt
formato e impresiónfs
API del sistema de archivoshash
biblioteca criptográficahttp
Servidor HTTPio
Biblioteca de E/Slog
utilidades de registromime
Soporte para datos multipartenode
Capa de compatibilidad de Node.jspath
manipulación de rutaws
conectores web
Otro ejemplo de Deno
Veamos otro ejemplo de una aplicación Deno, de los ejemplos de Deno cat
:
const filenames = Deno.argsfor (const filename of filenames) { const file = await Deno.open(filename) await Deno.copy(file, Deno.stdout) file.close()}
Esto asigna a la filenames
variable el contenido de Deno.args
, que es una variable que contiene todos los argumentos enviados al comando.
Los recorremos en iteración y, para cada uno de ellos, usamos Deno.open()
para abrir el archivo y usamos Deno.copy()
para imprimir el contenido del archivo en Deno.stdout
. Finalmente, cerramos el archivo.
Si ejecuta esto usando
deno run https://deno.land/std/examples/cat.ts
El programa se descarga y se compila, y no pasa nada porque no especificamos ningún argumento.
Pruébalo ahora
deno run https://deno.land/std/examples/cat.ts app.ts
suponiendo que tengas app.ts
del proyecto anterior en la misma carpeta.
Recibirás un error de permiso:
Debido a que Deno no permite el acceso al sistema de archivos de forma predeterminada, se puede conceder acceso a la carpeta actual mediante --allow-read=./
:
deno run --allow-read=./ https://deno.land/std/examples/cat.ts app.ts
¿Existe un Express/Hapi/Koa/* para Deno?
Sí, definitivamente. Echa un vistazo a proyectos como
- deno-drash
- deno-express
- roble
- pogo
- Sirve
Ejemplo: utilizar Oak para crear una API REST
Quiero dar un ejemplo sencillo de cómo crear una API REST con Oak. Oak es interesante porque está inspirado en Koa, el popular middleware de Node.js, y por eso resulta muy familiar si ya lo has usado antes.
La API que vamos a construir es muy simple.
Nuestro servidor almacenará, en memoria, una lista de perros con nombre y edad.
Queremos:
- añadir nuevos perros
- lista de perros
- Obtenga detalles sobre un perro específico
- eliminar un perro de la lista
- actualizar la edad de un perro
Lo haremos en TypeScript, pero nada le impide escribir la API en JavaScript: simplemente elimine los tipos.
Crear un app.ts
archivo.
Comencemos importando los objetos Application
y Router
de Oak:
import { Application, Router } from 'https://deno.land/x/oak/mod.ts'
Luego obtenemos las variables de entorno PORT y HOST:
const env = Deno.env.toObject()const PORT = env.PORT || 4000const HOST = env.HOST || '127.0.0.1'
De forma predeterminada, nuestra aplicación se ejecutará en localhost:4000.
Ahora creamos la aplicación Oak y la iniciamos:
const router = new Router()const app = new Application()app.use(router.routes())app.use(router.allowedMethods())console.log(`Listening on port ${PORT}...`)await app.listen(`${HOST}:${PORT}`)
Ahora la aplicación debería compilarse bien.
Correr
deno run --allow-env --allow-net app.ts
y Deno descargará las dependencias:
y luego escuchar en el puerto 4000.
Las siguientes veces que ejecute el comando, Deno omitirá la parte de instalación porque esos paquetes ya están almacenados en caché:
En la parte superior del archivo, definamos una interfaz para un perro, luego declaramos una dogs
matriz inicial de objetos Perro:
interface Dog { name: string age: number}let dogs: ArrayDog = [ { name: 'Roger', age: 8, }, { name: 'Syd', age: 7, },]
Ahora implementemos realmente la API.
Ya tenemos todo listo. Después de crear el enrutador, agreguemos algunas funciones que se invocarán cada vez que se acceda a uno de esos puntos finales:
const router = new Router()router .get('/dogs', getDogs) .get('/dogs/:name', getDog) .post('/dogs', addDog) .put('/dogs/:name', updateDog) .delete('/dogs/:name', removeDog)
¿Ves? Definimos
GET /dogs
GET /dogs/:name
POST /dogs
PUT /dogs/:name
DELETE /dogs/:name
Vamos a implementarlos uno por uno.
A partir de GET /dogs
, que devuelve la lista de todos los perros:
export const getDogs = ({ response }: { response: any }) = { response.body = dogs}
A continuación, te explicamos cómo podemos recuperar un solo perro por su nombre:
export const getDog = ({ params, response,}: { params: { name: string } response: any}) = { const dog = dogs.filter((dog) = dog.name === params.name) if (dog.length) { response.status = 200 response.body = dog[0] return } response.status = 400 response.body = { msg: `Cannot find dog ${params.name}` }}
Así es como agregamos un nuevo perro:
export const addDog = async ({ request, response,}: { request: any response: any}) = { const body = await request.body() const dog: Dog = body.value dogs.push(dog) response.body = { msg: 'OK' } response.status = 200}
Tenga en cuenta que ahora uso const body = await request.body()
para obtener el contenido del cuerpo, ya que los valores name
y age
se pasan como JSON.
Así es como actualizamos la edad de un perro:
export const updateDog = async ({ params, request, response,}: { params: { name: string } request: any response: any}) = { const temp = dogs.filter((existingDog) = existingDog.name === params.name) const body = await request.body() const { age }: { age: number } = body.value if (temp.length) { temp[0].age = age response.status = 200 response.body = { msg: 'OK' } return } response.status = 400 response.body = { msg: `Cannot find dog ${params.name}` }}
Y así es como podemos eliminar un perro de nuestra lista:
export const removeDog = ({ params, response,}: { params: { name: string } response: any}) = { const lengthBefore = dogs.length dogs = dogs.filter((dog) = dog.name !== params.name) if (dogs.length === lengthBefore) { response.status = 400 response.body = { msg: `Cannot find dog ${params.name}` } return } response.body = { msg: 'OK' } response.status = 200}
Aquí está el código de ejemplo completo:
Tal vez te puede interesar:
- Introducción a React
- Agregar evento de clic a los elementos DOM devueltos desde querySelectorAll
- Cómo cambiar el valor de un nodo DOM
- Cómo comprobar si un elemento DOM tiene una clase
El manual de Deno: una introducción concisa a Deno
¿Qué es Deno?¿Por qué Deno? ¿Por qué ahora?¿Deberías aprender Deno?¿Reemplazarás a Node.js?Compatibilidad con TypeScript de primera claseSimilitudes
programar
es
2025-01-09
Si crees que alguno de los contenidos (texto, imagenes o multimedia) en esta página infringe tus derechos relativos a propiedad intelectual, marcas registradas o cualquier otro de tus derechos, por favor ponte en contacto con nosotros en el mail [email protected] y retiraremos este contenido inmediatamente