Seznamte se s tímto runtime JS zaměřeným na bezpečnost pomocí praktického příkladu projektu.
Deno je běhové prostředí JavaScriptu postavené na V8, stejném stroji JavaScript, který pohání Google Chrome. Původní tvůrce Node.js vytvořil Deno, aby vyřešil některé nedostatky a bezpečnostní problémy Node.js.
Přestože je Deno relativně nový, získal si oblibu jako bezpečný a moderní běhový modul JavaScriptu. Jeho zaměření na zabezpečení, podpora moderních jazykových funkcí a vývojářské nástroje z něj činí přitažlivou volbu. Můžete jej použít k vytváření aplikací na straně serveru, nástrojů příkazového řádku a dalších projektů JavaScript/TypeScript, jako je jednoduché rozhraní API.
Instalace Deno
Než budete moci používat Deno, musíte si jej stáhnout a nainstalovat. Instalace Deno se liší v závislosti na vašem operačním systému.
V systémech macOS a Linux můžete Deno nainstalovat spuštěním tohoto příkazu:
curl -fsSL https://deno.land/x/install/install.sh | sh
V systému Windows můžete nainstalovat Deno s Powershell pomocí tohoto příkazu:
irm https://deno.land/install.ps1 | iex
Úspěšnou instalaci můžete potvrdit spuštěním příkazu níže:
deno --version
Výše uvedený příkaz by měl vytisknout verzi Deno do konzoly.
Pokud používáte VS Code jako IDE, můžete si ho stáhnout Rozšíření VS Code společnosti Deno přidat IntelliSense, což zvýší vaši produktivitu a vývojové zkušenosti při práci s projekty Deno.
Po úspěšné instalaci rozšíření vytvořte a .vscode složku v kořenovém adresáři vašeho projektu a vytvořte a settings.json soubor v něm.
Dále přidejte blok kódu níže do settings.json soubor pro aktivaci IntelliSense:
{
"deno.enable": true,
"deno.unstable": true,
}
Připojení k databázi
V tomto tutoriálu použijete MongoDB jako databázi k uchování dat z vašeho API.
Chcete-li připojit svou aplikaci Deno k databázi MongoDB, vytvořte a db.js soubor v kořenovém adresáři projektu a přidejte do něj níže uvedený blok kódu:
// 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 rozdíl od Node.js, který závisí na správci balíčků stejně jako Node Package Manager (npm) nebo yarn má Deno vestavěný systém správy balíčků pro import a správu závislostí přímo z URL.
Importuje se například blok kódu výše MongoClient z adresy URL https://deno.land/x/[email protected]/mod.ts, která vede k balíčku.
Poté pomocí importovaného ovladače Deno MongoDB (MongoClient), Deno naváže spojení mezi vaší aplikací a místní databází MongoDB.
V živých scénářích je bezpečnější ukládat přihlašovací údaje k databázi v .env místo jejich uložení ve formátu prostého textu, jak je uvedeno výše.
Vytvoření databázového modelu
Zatímco je to možné komunikovat s databází MongoDB bez databázového modelu to může vést k nestrukturovanému a méně udržovatelnému kódu.
Abyste tomu zabránili, vytvořte a TodoModel.ts soubor v kořenovém adresáři vašeho projektu a strukturujte svá data přidáním bloku kódu níže do souboru:
import db from"./db.ts";
interface Todo {
title: string;
description: string;
completed?: boolean;
}const Todo = db.collection
("todos");
exportdefault Todo;
Výše uvedený blok kódu definuje rozhraní Dělat který představuje strukturu jedné položky úkolu. Poté pomocí rozhraní Todo vytvoří kolekci Todo voláním metody kolekce vystavené dříve vytvořenou instancí MongoDB.
Vytvoření serveru s dubem
Oak je middleware pro nativní HTTP server společnosti Deno. To bylo inspirováno Koa, což je an alternativa k Express.js.
Chcete-li vytvořit server s Oak, vytvořte a main.ts v kořenovém adresáři projektu a přidejte do svého souboru níže uvedený blok kódu.
// 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 výše se importuje aplikace z adresy URL Oak a vytvoří instanci aplikace (aplikace), který naslouchá příchozímu provozu na portu 8000.
The app.use (router.routes()) line registruje trasy routeru jako middleware v aplikaci Oak. To znamená, že aplikace bude porovnávat registrované trasy s příchozími požadavky a odpovídající obslužné rutiny budou spuštěny, pokud existuje shoda.
The app.use (router.allowedMethods()) line zpracovává HTTP metody, které nejsou explicitně definovány v routeru. Pokud například obdrží požadavek s nepodporovanou metodou, například neregistrovaný požadavek PUT, povolené metody() middleware automaticky odešle vhodnou odpověď (např. Metoda 405 není povolena).
Implementace funkcionality CRUD
Tento tutoriál bude obsahovat jednoduché todo API s funkcí CRUD.
Vytvořit router.ts soubor v kořenovém adresáři vašeho projektu a přidejte do svého souboru níže uvedený blok kódu:
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
Výše uvedený blok kódu importuje a vytvoří instanci směrovače Oak. Pomocí této instance můžete vytvořit obslužné rutiny směrování pro různé metody HTTP voláním příslušných názvů metod (dostat, pošta, dát, vymazat).
Například níže uvedený blok kódu je příkladem toho, jak můžete vytvořit obslužnou rutinu trasy GET, která vrátí všechny dokumenty ve vaší kolekci úkolů.
router
.get("/api/todos", (ctx: RouterContextapi/todos">) => {
ctx.response.body = Todo.find();
})
Chcete-li odeslat objekt odpovědi pomocí Deno, musíte přiřadit odezva.tělo objekt na RouterContex na objekt odpovědi. Totéž platí pro stavové kódy.
Chcete-li přidat další obslužné nástroje tras, můžete je zřetězit s předchozí obslužnou rutinou tras.
Jako tak:
.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,
};
}
})
Blok kódu výše definuje obslužnou rutinu trasy GET, která vrací jednu položku úkolu, která odpovídá id v parametrech adresy URL.
Dále definujte obslužný program CREATE route, který přidá nové dokumenty do vaší kolekce:
.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,
};
}
})
Dále přidejte obslužnou rutinu trasy PUT, která aktualizuje úkol na základě id s daty odeslanými v těle požadavku.
.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,
};
}
})
Nakonec vytvořte obslužnou rutinu trasy DELETE, která odstraní úkol z vaší sbírky 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",
};
});
Aplikaci Deno můžete spustit pomocí tohoto příkazu:
deno run --allow-net --allow-read --allow-env --watch main.ts
Ve výchozím nastavení nemá skript Deno přístup k ničemu mimo svůj rozsah, jako je síť nebo systém souborů. Chcete-li tedy spustit aplikaci, musíte zahrnout různé příznaky, které společnosti Deno udělí požadovaná oprávnění.
--allow-net umožňuje společnosti Deno vytvářet síťové požadavky. --povolit-číst umožňuje společnosti Deno přístup k systému souborů a čtení souborů. --allow-env umožňuje společnosti Deno přístup k proměnným prostředí. The --hodinky flag spustí vaši aplikaci Deno v režimu sledování.
Migrace z Node.js na Deno
Migrace z Node.js na Deno pro vytváření REST API může přinést významné výhody v oblasti zabezpečení, produktivity vývojářů a správy závislostí. Pomocí zabezpečeného běhového prostředí Deno, nativní podpory TypeScript a zjednodušené správy závislostí můžete snadno vytvářet robustní a efektivní REST API.
Nevyzrálý ekosystém společnosti Deno vás však může přimět k přehodnocení. Pokud se rozhodnete pro migraci, pečlivě zvažte pro a proti.