Susipažinkite su šiuo į saugumą orientuotu JS vykdymo laiku naudodamiesi praktiniu projekto pavyzdžiu.
„Deno“ yra „JavaScript“ vykdymo laikas, sukurtas naudojant V8, tą patį „JavaScript“ variklį, kuris maitina „Google Chrome“. Pradinis Node.js kūrėjas sukūrė Deno, kad pašalintų kai kuriuos Node.js trūkumus ir saugumo problemas.
Nors „Deno“ yra palyginti naujas, jis išpopuliarėjo kaip saugus ir modernus „JavaScript“ vykdymo laikas. Dėmesys saugumui, šiuolaikinių kalbos funkcijų palaikymas ir kūrėjams pritaikyti įrankiai daro jį patraukliu pasirinkimu. Galite naudoti jį kurdami serverio programas, komandų eilutės įrankius ir kitus „JavaScript“ / „TypeScript“ projektus, pvz., paprastą API.
Deno diegimas
Kad galėtumėte naudoti Deno, turite jį atsisiųsti ir įdiegti. „Deno“ diegimas skiriasi priklausomai nuo jūsų operacinės sistemos.
„MacOS“ ir „Linux“ sistemose galite įdiegti „Deno“ vykdydami šią komandą:
curl -fsSL https://deno.land/x/install/install.sh | sh
„Windows“ sistemoje galite įdiegti „Deno“ su „Powershell“ naudodami šią komandą:
irm https://deno.land/install.ps1 | iex
Galite patvirtinti, kad diegimas buvo sėkmingas, vykdydami toliau pateiktą komandą:
deno --version
Aukščiau pateikta komanda turėtų išspausdinti Deno versiją į konsolę.
Jei naudojate VS kodą kaip IDE, galite atsisiųsti Deno VS kodo plėtinys pridėti IntelliSense, padidindama jūsų produktyvumą ir tobulinimo patirtį dirbant su Deno projektais.
Sėkmingai įdiegę plėtinį sukurkite a .vscode aplanką savo projekto šakniniame kataloge ir sukurkite a settings.json failą jame.
Tada pridėkite žemiau esantį kodo bloką prie settings.json failą, kad įjungtumėte „IntelliSense“:
{
"deno.enable": true,
"deno.unstable": true,
}
Prisijungimas prie duomenų bazės
Šiame vadove naudosite MongoDB kaip duomenų bazę, kad išsaugotumėte duomenis iš savo API.
Norėdami prijungti savo Deno programą prie MongoDB duomenų bazės, sukurkite a db.js failą savo projekto šakniniame kataloge ir pridėkite prie jo žemiau esantį kodo bloką:
// 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;
Skirtingai nuo Node.js, kuris priklauso nuo paketų tvarkytojai kaip Node Package Manager (npm) arba siūlai, Deno turi integruotą paketų valdymo sistemą, skirtą importuoti ir valdyti priklausomybes tiesiai iš URL.
Pavyzdžiui, aukščiau esantis kodo blokas importuoja MongoClient iš URL https://deno.land/x/[email protected]/mod.ts, kuris veda į pakuotę.
Tada, naudodami importuotą Deno MongoDB tvarkyklę (MongoClient), Deno sukuria ryšį tarp jūsų programos ir vietinės MongoDB duomenų bazės.
Esant tiesioginiams scenarijams, yra saugiau saugoti duomenų bazės kredencialus .env failą, o ne saugoti juos paprastu tekstu, kaip buvo padaryta aukščiau.
Duomenų bazės modelio kūrimas
Nors įmanoma sąveikauti su MongoDB duomenų baze be duomenų bazės modelio, tai gali sukelti nestruktūrizuotą ir mažiau prižiūrimą kodą.
Norėdami to išvengti, sukurkite a TodoModel.ts failą į savo projekto šakninį katalogą ir susisteminkite duomenis, prie failo pridėdami toliau pateiktą kodo bloką:
import db from"./db.ts";
interface Todo {
title: string;
description: string;
completed?: boolean;
}const Todo = db.collection
("todos");
exportdefault Todo;
Aukščiau pateiktas kodo blokas apibrėžia sąsają Daryti kuri reprezentuoja vieno todo elemento struktūrą. Tada, naudodamas „Todo“ sąsają, jis sukuria „Todo“ kolekciją iškviesdamas rinkimo metodą, kurį parodė anksčiau sukurtas „MongoDB“ egzempliorius.
Serverio su ąžuolu kūrimas
„Oak“ yra tarpinė programinė įranga, skirta „Deno“ vietiniam HTTP serveriui. Jį įkvėpė Koa, kuri yra alternatyva Express.js.
Norėdami sukurti serverį su Oak, sukurkite a pagrindinis.ts failą į savo projekto šakninį katalogą ir prie failo pridėkite žemiau esantį kodo bloką.
// 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");
Aukščiau pateiktas kodo blokas importuojamas Taikymas iš Oak URL ir sukuria programos egzempliorių (programėlė), kuris klauso įeinančio srauto per 8000 prievadą.
The app.use (router.routes()) linija užregistruoja maršrutizatoriaus maršrutus kaip tarpinę programinę įrangą „Oak“ programoje. Tai reiškia, kad programa suderins registruotų maršrutų valią su gaunamomis užklausomis, o atitinkami tvarkytojai veiks, jei atitiks.
The app.use (router.allowedMethods()) eilutė tvarko HTTP metodus, kurie nėra aiškiai apibrėžti maršrutizatoriuje. Pavyzdžiui, jei jis gauna užklausą su nepalaikomu metodu, pavyzdžiui, neregistruota PUT užklausa, leidžiami metodai () tarpinė programinė įranga automatiškai išsiųs atitinkamą atsakymą (pvz., 405 Metodas neleidžiamas).
CRUD funkcionalumo įgyvendinimas
Šioje pamokoje bus paprasta „todo“ API su CRUD funkcija.
Sukurti maršrutizatorius.ts failą savo projekto šakniniame kataloge ir prie failo pridėkite toliau pateiktą kodo bloką:
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
Aukščiau pateiktas kodo blokas importuoja ir sukuria Oak maršrutizatoriaus egzempliorių. Naudodami šį pavyzdį galite sukurti maršruto tvarkykles įvairiems HTTP metodams iškviesdami atitinkamus metodų pavadinimus (gauti, paštu, įdėti, Ištrinti).
Pavyzdžiui, toliau pateiktas kodo blokas yra pavyzdys, kaip galite sukurti GET maršruto tvarkyklę, kuri grąžintų visus jūsų Todo kolekcijos dokumentus.
router
.get("/api/todos", (ctx: RouterContextapi/todos">) => {
ctx.response.body = Todo.find();
})
Norėdami išsiųsti atsakymo objektą naudodami Deno, turite priskirti atsakas.kūnas objektą RouterContex į atsakymo objektą. Tas pats pasakytina ir apie būsenos kodus.
Jei norite pridėti kitų maršruto tvarkytojų, galite susieti juos su ankstesne maršruto tvarkykle.
Kaip taip:
.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,
};
}
})
Aukščiau pateiktas kodo blokas apibrėžia GET maršruto tvarkyklę, kuri grąžina vieną užduoties elementą, atitinkantį URL parametruose esantį ID.
Tada apibrėžkite CREATE maršruto tvarkyklę, kuri prideda naujų dokumentų į jūsų kolekciją:
.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,
};
}
})
Tada pridėkite PUT maršruto tvarkyklę, kuri atnaujina užduotį pagal id parametrą, su duomenimis, išsiųstais užklausos turinyje.
.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,
};
}
})
Galiausiai sukurkite DELETE maršruto tvarkyklę, kuri pašalina užduotį iš jūsų MongoDB kolekcijos:
.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",
};
});
Deno programą galite paleisti naudodami šią komandą:
deno run --allow-net --allow-read --allow-env --watch main.ts
Pagal numatytuosius nustatymus Deno scenarijus negali pasiekti nieko, nepriklausančio jo taikymo sričiai, pvz., tinklo ar failų sistemos. Taigi, norėdami pradėti savo programą, turite įtraukti įvairias vėliavėles, kad suteiktumėte Deno reikiamus leidimus.
--allow-net leidžia Deno pateikti tinklo užklausas. --leisti-skaityti leidžia Deno pasiekti failų sistemą ir skaityti failus. --allow-env leidžia Deno pasiekti aplinkos kintamuosius. The -- žiūrėti vėliavėlė paleidžia „Deno“ programą laikrodžio režimu.
Perkeliama iš Node.js į Deno
Perkėlimas iš Node.js į Deno kuriant REST API gali suteikti daug saugumo, kūrėjo produktyvumo ir priklausomybės valdymo pranašumų. Naudodami saugų „Deno“ vykdymo laiką, savąjį „TypeScript“ palaikymą ir supaprastintą priklausomybės valdymą, galite lengvai sukurti patikimas ir efektyvias REST API.
Tačiau nesubrendusi Deno ekosistema gali priversti jus permąstyti. Jei nuspręsite migruoti, atidžiai pasverkite privalumus ir trūkumus.