Spoznajte to varnostno osredotočeno izvajalno okolje JS s praktičnim primerom projekta.

Deno je izvajalno okolje JavaScript, zgrajeno na V8, istem motorju JavaScript, ki poganja Google Chrome. Prvotni ustvarjalec Node.js je ustvaril Deno, da bi rešil nekatere pomanjkljivosti in varnostne pomisleke Node.js.

Čeprav je razmeroma nov, je Deno postal priljubljen kot varno in sodobno izvajalno okolje JavaScript. Zaradi osredotočenosti na varnost, podporo za sodobne jezikovne funkcije in razvijalcem prijazna orodja je privlačna izbira. Uporabite ga lahko za izdelavo aplikacij na strani strežnika, orodij ukazne vrstice in drugih projektov JavaScript/TypeScript, kot je preprost API.

Namestitev Deno

Preden lahko uporabite Deno, ga morate prenesti in namestiti. Namestitev Deno se razlikuje glede na vaš operacijski sistem.

V sistemih macOS in Linux lahko Deno namestite tako, da zaženete ta ukaz:

curl -fsSL https://deno.land/x/install/install.sh | sh

V sistemu Windows lahko Deno namestite s programom Powershell s tem ukazom:

irm https://deno.land/install.ps1 | iex

Lahko potrdite, da je bila vaša namestitev uspešna, tako da zaženete spodnji ukaz:

deno --version

Zgornji ukaz bi moral natisniti različico Deno na konzolo.

Če uporabljate kodo VS kot IDE, lahko prenesete Denojeva razširitev kode VS da dodate IntelliSense, s čimer izboljšate svojo produktivnost in razvojno izkušnjo pri delu s projekti Deno.

Po uspešni namestitvi razširitve ustvarite a .vscode mapo v korenskem imeniku vašega projekta in ustvarite a nastavitve.json datoteko v njej.

Nato dodajte spodnji blok kode v nastavitve.json datoteko za omogočanje IntelliSense:

{
"deno.enable": true,
"deno.unstable": true,
}

Povezovanje z bazo podatkov

Za to vadnico boste uporabili MongoDB kot bazo podatkov za ohranjanje podatkov iz vašega API-ja.

Če želite svojo aplikacijo Deno povezati z zbirko podatkov MongoDB, ustvarite a db.js datoteko v korenskem imeniku vašega projekta in ji dodajte spodnji blok kode:

// 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;

Za razliko od Node.js, ki je odvisen od upravitelji paketov Tako kot Node Package Manager (npm) ali yarn ima Deno vgrajen sistem za upravljanje paketov za uvoz in upravljanje odvisnosti neposredno iz URL-jev.

Na primer, blok kode zgoraj uvozi MongoClient iz naslova URL https://deno.land/x/[email protected]/mod.ts, ki vodi do paketa.

Nato z uporabo uvoženega gonilnika Deno MongoDB (MongoClient), Deno vzpostavi povezavo med vašo aplikacijo in lokalno bazo podatkov MongoDB.

V scenarijih v živo je bolj varno, če poverilnice baze podatkov shranite v .env namesto da bi jih shranili v golo besedilo, kot je storjeno zgoraj.

Ustvarjanje modela baze podatkov

Medtem ko je mogoče interakcijo z bazo podatkov MongoDB brez modela baze podatkov lahko to povzroči nestrukturirano kodo, ki jo je težje vzdrževati.

Da bi se temu izognili, ustvarite a TodoModel.ts datoteko v korenskem imeniku vašega projekta in strukturirajte svoje podatke tako, da v datoteko dodate spodnji blok kode:

import db from"./db.ts";

interface Todo {
title: string;
description: string;
completed?: boolean;
}

const Todo = db.collection("todos");

exportdefault Todo;

Zgornji blok kode definira vmesnik Narediti ki predstavlja strukturo posameznega opravila. Nato z vmesnikom Todo ustvari zbirko Todo tako, da pokliče metodo zbiranja, ki jo je izpostavil vaš predhodno ustvarjen primerek MongoDB.

Ustvarjanje strežnika s hrastom

Oak je vmesna programska oprema za Denov izvorni strežnik HTTP. Navdihnila ga je Koa, ki je alternativa Express.js.

Če želite ustvariti strežnik z Oak, ustvarite a main.ts datoteko v korenskem imeniku vašega projekta in svoji datoteki dodajte spodnji blok kode.

// 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 kode zgoraj uvozi Aplikacija iz URL-ja Oak in ustvari primerek aplikacije (aplikacija), ki posluša dohodni promet na vratih 8000.

The app.use (router.routes()) line registrira poti usmerjevalnika kot vmesno programsko opremo v aplikaciji Oak. To pomeni, da bo aplikacija primerjala registrirane poti z dohodnimi zahtevami in da se bodo ustrezni obdelovalci izvajali, če ujemanje obstaja.

The app.use (router.allowedMethods()) vrstica obravnava metode HTTP, ki niso izrecno definirane v usmerjevalniku. Če na primer prejme zahtevo z nepodprto metodo, na primer neregistrirano zahtevo PUT, dovoljene metode() vmesna programska oprema bo samodejno poslala ustrezen odgovor (npr. 405 Metoda ni dovoljena).

Izvajanje funkcionalnosti CRUD

Ta vadnica bo vsebovala preprost API opravil s funkcijo CRUD.

Ustvariti usmerjevalnik.ts datoteko v korenskem imeniku vašega projekta in svoji datoteki dodajte spodnji blok kode:

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

Zgornji blok kode uvozi in ustvari primerek usmerjevalnika Oak. Z uporabo tega primerka lahko ustvarite upravljalnike poti za različne metode HTTP s klicem ustreznih imen metod (dobiti, post, postaviti, izbrisati).

Na primer, spodnji blok kode je primer, kako lahko ustvarite upravljalnik poti GET, ki vrne vse dokumente v vaši zbirki Todo.

router
.get("/api/todos", (ctx: RouterContextapi/todos">) => {
ctx.response.body = Todo.find();
})

Če želite poslati odzivni objekt z uporabo Deno, morate dodeliti odgovor.telo objekta na RouterContexu v odzivni objekt. Enako velja za statusne kode.

Če želite dodati druge obdelovalce poti, jih lahko povežete s prejšnjim obdelovalcem poti.

takole:

.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,
};
}
})

Zgornji blok kode definira obravnavo poti GET, ki vrne en sam element Todo, ki se ujema z ID-jem v parametrih URL-ja.

Nato definirajte upravljalnik poti CREATE, ki v vašo zbirko doda nove dokumente:

.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,
};
}
})

Nato dodajte upravljalnik poti PUT, ki posodobi Todo na podlagi id parameter s podatki, poslanimi v telesu zahteve.

.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,
};
}
})

Končno ustvarite upravljalnik poti DELETE, ki odstrani Todo iz vaše zbirke 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",
};
});

Aplikacijo Deno lahko zaženete s tem ukazom:

deno run --allow-net --allow-read --allow-env --watch main.ts

Skript Deno privzeto ne more dostopati do ničesar zunaj svojega obsega, na primer do omrežja ali datotečnega sistema. Če želite zagnati svojo aplikacijo, morate vključiti različne zastavice, da Denu podelite potrebna dovoljenja.

--allow-net omogoča Denu, da postavlja omrežne zahteve. --dovoli-branje omogoča Denu dostop do datotečnega sistema in branje datotek. --allow-env omogoča Denu dostop do okoljskih spremenljivk. The --pazi zastavica zažene vašo aplikacijo Deno v načinu ure.

Selitev z Node.js na Deno

Selitev z Node.js na Deno za gradnjo API-jev REST lahko prinese pomembne prednosti glede varnosti, produktivnosti razvijalcev in upravljanja odvisnosti. Z uporabo varnega izvajalnega okolja Deno, izvorne podpore za TypeScript in poenostavljenega upravljanja odvisnosti lahko enostavno ustvarite robustne in učinkovite API-je REST.

Vendar pa vas lahko zaradi nezrelega ekosistema Deno ponovno razmislite. Če se odločite za selitev, natančno pretehtajte prednosti in slabosti.