Spoznajte toto prostredie JS runtime zamerané na bezpečnosť pomocou praktického príkladu projektu.
Deno je JavaScript runtime postavený na V8, rovnakom JavaScript engine, ktorý poháňa Google Chrome. Pôvodný tvorca Node.js vytvoril Deno, aby vyriešil niektoré nedostatky a bezpečnostné obavy Node.js.
Aj keď je Deno relatívne nový, získal si popularitu ako bezpečný a moderný modul JavaScript. Jeho zameranie na bezpečnosť, podpora moderných jazykových funkcií a vývojárske nástroje z neho robia príťažlivú voľbu. Môžete ho použiť na vytváranie aplikácií na strane servera, nástrojov príkazového riadka a iných projektov JavaScript/TypeScript, napríklad jednoduchého rozhrania API.
Inštalácia Deno
Pred použitím Deno si ho musíte stiahnuť a nainštalovať. Inštalácia Deno sa líši v závislosti od vášho operačného systému.
V systémoch macOS a Linux môžete Deno nainštalovať spustením tohto príkazu:
curl -fsSL https://deno.land/x/install/install.sh | sh
V systéme Windows môžete nainštalovať Deno s Powershell pomocou tohto príkazu:
irm https://deno.land/install.ps1 | iex
Úspešnosť inštalácie môžete potvrdiť spustením príkazu nižšie:
deno --version
Vyššie uvedený príkaz by mal vytlačiť verziu Deno do konzoly.
Ak používate kód VS ako IDE, môžete si ho stiahnuť Rozšírenie VS Code od spoločnosti Deno pridať IntelliSense, čím sa zvýši vaša produktivita a skúsenosti s vývojom pri práci s projektmi Deno.
Po úspešnej inštalácii rozšírenia vytvorte a .vscode priečinok v koreňovom adresári vášho projektu a vytvorte a settings.json súbor v ňom.
Potom pridajte blok kódu nižšie do settings.json súbor na aktiváciu IntelliSense:
{
"deno.enable": true,
"deno.unstable": true,
}
Pripojenie k databáze
Pre tento tutoriál použijete MongoDB ako databázu na uchovávanie údajov z vášho API.
Ak chcete pripojiť svoju aplikáciu Deno k databáze MongoDB, vytvorte a db.js súbor v koreňovom adresári projektu a pridajte doň blok kódu nižšie:
// db.js
import { MongoClient } from"https://deno.land/x/[email protected]/mod.ts";const client = new MongoClient();
try {
await client.connect("mongodb://localhost: 27017/todo");console.log("Connected to database");
} catch (err) {
console.log("Error connecting to database", err);
}const db = client.database("todo");
exportdefault db;
Na rozdiel od Node.js, ktorý závisí od správcov balíkov podobne ako Node Package Manager (npm) alebo yarn, Deno má zabudovaný systém správy balíčkov na import a správu závislostí priamo z URL.
Napríklad blok kódu nad importom MongoClient z adresy URL https://deno.land/x/[email protected]/mod.ts, ktorá vedie k balíku.
Potom pomocou importovaného ovládača Deno MongoDB (MongoClient), Deno vytvorí spojenie medzi vašou aplikáciou a lokálnou databázou MongoDB.
V živých scenároch je bezpečnejšie uložiť poverenia databázy v súbore .env namiesto ich uloženia vo formáte obyčajného textu, ako je uvedené vyššie.
Vytvorenie databázového modelu
Kým je to možné komunikovať s databázou MongoDB bez databázového modelu to môže viesť k neštruktúrovanému a menej udržiavateľnému kódu.
Aby ste tomu zabránili, vytvorte a TodoModel.ts súbor v koreňovom adresári vášho projektu a štruktúrujte svoje údaje pridaním bloku kódu nižšie do súboru:
import db from"./db.ts";
interface Todo {
title: string;
description: string;
completed?: boolean;
}const Todo = db.collection
("todos");
exportdefault Todo;
Vyššie uvedený blok kódu definuje rozhranie Robiť ktorý predstavuje štruktúru jednej položky úloh. Potom pomocou rozhrania Todo vytvorí kolekciu Todo zavolaním metódy kolekcie vystavenej vašou predtým vytvorenou inštanciou MongoDB.
Vytvorenie servera s dubom
Oak je middleware pre natívny HTTP server spoločnosti Deno. Bol inšpirovaný Koa, čo je an alternatíva k Express.js.
Ak chcete vytvoriť server s Oak, vytvorte a main.ts súbor v koreňovom adresári projektu a pridajte do svojho súboru blok kódu nižšie.
// main.ts
import { Application } from"https://deno.land/x/oak/mod.ts";
import router from"./router.ts";const app = new Application();
app.use(router.routes());
app.use(router.allowedMethods());
await app.listen({ port: 8000 });
console.log("Server running on port 8000");
Blok kódu nad importom Aplikácia z adresy URL Oak a vytvorí inštanciu aplikácie (aplikácie), ktorý počúva prichádzajúcu prevádzku na porte 8000.
The app.use (router.routes()) line registruje trasy smerovača ako middleware v aplikácii Oak. To znamená, že aplikácia bude porovnávať registrované trasy s prichádzajúcimi požiadavkami a ak existuje zhoda, spustia sa príslušné obslužné programy.
The app.use (router.allowedMethods()) linka spracováva metódy HTTP, ktoré nie sú explicitne definované v smerovači. Ak napríklad dostane požiadavku s nepodporovanou metódou, napríklad neregistrovanú požiadavku PUT, povolené metódy() middleware automaticky odošle príslušnú odpoveď (napr. Metóda 405 nie je povolená).
Implementácia funkcionality CRUD
Tento tutoriál bude obsahovať jednoduché todo API s funkcionalitou CRUD.
Vytvor router.ts súbor v koreňovom adresári vášho projektu a do súboru pridajte blok kódu nižšie:
import { Router } from"https://deno.land/x/oak/mod.ts";
import Todo from"./todoModel.ts";
import { ObjectId } from"https://deno.land/x/[email protected]/mod.ts";
const router = new Router(); // Create Router
Vyššie uvedený blok kódu importuje a vytvorí inštanciu smerovača Oak. Pomocou tejto inštancie môžete vytvoriť obslužné nástroje smerovania pre rôzne metódy HTTP volaním príslušných názvov metód (dostať, príspevok, dať, vymazať).
Napríklad blok kódu nižšie je príkladom toho, ako môžete vytvoriť obslužný program trasy GET, ktorý vráti všetky dokumenty vo vašej kolekcii úloh.
router
.get("/api/todos", (ctx: RouterContextapi/todos">) => {
ctx.response.body = Todo.find();
})
Ak chcete odoslať objekt odpovede pomocou Deno, musíte priradiť odozva.telo objekt na RouterContex na objekt odpovede. To isté platí pre stavové kódy.
Ak chcete pridať ďalšie obslužné nástroje trasy, môžete ich spojiť s predchádzajúcim obslužným nástrojom trasy.
Ako:
.get("/api/todo/:id", async (ctx: RouterContext<"/api/todo/:id">) => {
try {
const todo = await Todo.findOne({ _id: new ObjectId(ctx.params.id) });if (!todo) {
ctx.response.status = 404;ctx.response.body = {
msg: "Todo not found",
};return;
}ctx.response.body = todo;
} catch (error) {
ctx.response.status = 500;
ctx.response.body = {
msg: "Error getting todo",
error,
};
}
})
Vyššie uvedený blok kódu definuje obslužný program trasy GET, ktorý vracia jednu položku úlohy, ktorá sa zhoduje s id v parametroch adresy URL.
Ďalej definujte obsluhu CREATE route, ktorá pridáva nové dokumenty do vašej kolekcie:
.post("/api/todo/new", async (ctx: RouterContext<"/api/todo/new">) => {
const body = ctx.request.body();
const todo = await body.value;if (!todo) {
ctx.response.status = 400;
ctx.response.body = { msg: "Invalid data. Please provide a valid todo." };
return;
}const { title, description } = todo;
if (!(title && description)) {
ctx.response.status = 400;ctx.response.body = {
msg: "Title or description missing. Please provide a valid todo.",
};return;
}try {
await Todo.insertOne({
title: todo.title,
description: todo.description,
completed: false,
});ctx.response.status = 201;
ctx.response.body = {
msg: "Todo added successfully",
};
} catch (error) {
ctx.response.status = 500;
ctx.response.body = {
msg: "Error adding todo",
error,
};
}
})
Ďalej pridajte obslužný program trasy PUT, ktorý aktualizuje úlohu na základe id s údajmi odoslanými v tele požiadavky.
.put("/api/todo/:id", async (ctx: RouterContext<"/api/todo/:id">) => {
try {
const body = ctx.request.body();
const todo = await body.value;await Todo.updateOne(
{ _id: new ObjectId(ctx.params.id) },
{ $set: { title: todo.title, description: todo.description } }
);ctx.response.status = 200;
ctx.response.body = {
msg: "Todo updated successfully",
};
} catch (error) {
console.log(error);
ctx.response.status = 500;
ctx.response.body = {
msg: "Error updating todo",
error: error.message,
};
}
})
Nakoniec vytvorte obslužný program trasy DELETE, ktorý odstráni úlohu z vašej zbierky MongoDB:
.delete("/api/todo/:id", async (ctx: RouterContext<"/api/todo/:id">) => {
await Todo.deleteOne({ _id: new ObjectId(ctx.params.id) });ctx.response.status = 200;
ctx.response.body = {
msg: "Todo deleted successfully",
};
});
Aplikáciu Deno môžete spustiť pomocou tohto príkazu:
deno run --allow-net --allow-read --allow-env --watch main.ts
V predvolenom nastavení skript Deno nemôže pristupovať k ničomu mimo jeho rozsahu, ako je napríklad sieť alebo súborový systém. Ak chcete spustiť svoju aplikáciu, musíte zahrnúť rôzne príznaky, aby ste spoločnosti Deno udelili požadované povolenia.
--allow-net umožňuje spoločnosti Deno vytvárať sieťové požiadavky. --povoliť čítanie umožňuje spoločnosti Deno prístup k systému súborov a čítanie súborov. --allow-env umožňuje spoločnosti Deno prístup k premenným prostredia. The -- sledujte flag spustí vašu aplikáciu Deno v režime hodiniek.
Migrácia z Node.js na Deno
Migrácia z Node.js na Deno na vytváranie REST API môže priniesť značné výhody v oblasti bezpečnosti, produktivity vývojárov a správy závislostí. Pomocou zabezpečeného runtime, natívnej podpory TypeScript a zjednodušenej správy závislostí od spoločnosti Deno môžete ľahko vytvárať robustné a efektívne REST API.
Nezrelý ekosystém spoločnosti Deno však môže spôsobiť, že to prehodnotíte. Ak sa rozhodnete migrovať, dôkladne zvážte klady a zápory.