Iepazīstiet šo uz drošību vērsto JS izpildlaiku, izmantojot praktisku projekta piemēru.

Deno ir JavaScript izpildlaiks, kura pamatā ir V8 — tas pats JavaScript dzinējs, kas nodrošina Google Chrome darbību. Sākotnējais Node.js veidotājs izveidoja Deno, lai novērstu dažus Node.js trūkumus un drošības problēmas.

Lai gan tas ir salīdzinoši jauns, Deno ir ieguvis popularitāti kā drošs un moderns JavaScript izpildlaiks. Tā koncentrēšanās uz drošību, atbalsts modernām valodas funkcijām un izstrādātājiem draudzīgi rīki padara to par pievilcīgu izvēli. Varat to izmantot, lai izveidotu servera puses lietojumprogrammas, komandrindas rīkus un citus JavaScript/TypeScript projektus, piemēram, vienkāršu API.

Deno instalēšana

Lai varētu izmantot Deno, tas ir jālejupielādē un jāinstalē. Deno instalēšana atšķiras atkarībā no jūsu operētājsistēmas.

Operētājsistēmās macOS un Linux varat instalēt Deno, izpildot šo komandu:

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

Operētājsistēmā Windows varat instalēt Deno ar Powershell, izmantojot šo komandu:

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

Varat apstiprināt, ka instalēšana bija veiksmīga, izpildot tālāk norādīto komandu:

deno --version

Iepriekš esošajai komandai ir jādrukā Deno versija konsolē.

Ja izmantojat VS kodu kā IDE, varat lejupielādēt Deno VS koda paplašinājums lai pievienotu IntelliSense, uzlabojot jūsu produktivitāti un attīstības pieredzi, strādājot ar Deno projektiem.

Pēc veiksmīgas paplašinājuma instalēšanas izveidojiet a .vscode mapi sava projekta saknes direktorijā un izveidojiet a settings.json failu tajā.

Pēc tam pievienojiet tālāk norādīto koda bloku settings.json failu, lai iespējotu IntelliSense:

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

Savienojuma izveide ar datu bāzi

Šajā apmācībā jūs izmantosit MongoDB kā datu bāzi, lai saglabātu datus no jūsu API.

Lai savienotu savu Deno lietotni ar MongoDB datu bāzi, izveidojiet a db.js failu sava projekta saknes direktorijā un pievienojiet tam zemāk esošo koda bloku:

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

Atšķirībā no Node.js, kas ir atkarīgs no pakotņu pārvaldnieki tāpat kā Node Package Manager (npm) vai dzija, Deno ir iebūvēta pakotņu pārvaldības sistēma atkarību importēšanai un pārvaldībai tieši no URL.

Piemēram, koda bloks iepriekš importē Mongoklients no URL https://deno.land/x/[email protected]/mod.ts, kas ved uz iepakojumu.

Pēc tam, izmantojot importēto Deno MongoDB draiveri (Mongoklients), Deno izveido savienojumu starp jūsu lietojumprogrammu un vietējo MongoDB datu bāzi.

Tiešraides scenārijos ir drošāk saglabāt datu bāzes akreditācijas datus .env failu, nevis saglabāt tos vienkāršā tekstā, kā tas izdarīts iepriekš.

Datu bāzes modeļa izveide

Kamēr ir iespējams mijiedarboties ar MongoDB datu bāzi Ja nav datu bāzes modeļa, tas var novest pie nestrukturēta un mazāk uzturama koda.

Lai no tā izvairītos, izveidojiet a TodoModel.ts failu sava projekta saknes direktorijā un strukturējiet savus datus, failam pievienojot tālāk norādīto koda bloku:

import db from"./db.ts";

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

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

exportdefault Todo;

Iepriekš minētais koda bloks definē saskarni Darīt kas attēlo viena uzdevuma vienuma struktūru. Pēc tam, izmantojot Todo saskarni, tas izveido Todo kolekciju, izsaucot savākšanas metodi, ko atklāj jūsu iepriekš izveidotā MongoDB instance.

Servera izveide ar ozolu

Oak ir starpprogrammatūra Deno vietējam HTTP serverim. To iedvesmoja Koa, kas ir alternatīva Express.js.

Lai izveidotu serveri ar Oak, izveidojiet a galvenais.ts failu sava projekta saknes direktorijā un failam pievienojiet tālāk norādīto koda bloku.

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

Virs importētais koda bloks Pieteikums no Oak URL un izveido lietojumprogrammas gadījumu (lietotne), kas klausās ienākošo trafiku 8000. portā.

The app.use (router.routes()) līnija reģistrē maršrutētāja maršrutus kā starpprogrammatūru lietojumprogrammā Oak. Tas nozīmē, ka lietojumprogramma saskaņos reģistrētos maršrutus ar ienākošajiem pieprasījumiem, un attiecīgie apstrādātāji darbosies, ja būs atbilstība.

The app.use (router.allowedMethods()) līnija apstrādā HTTP metodes, kas maršrutētājā nav skaidri definētas. Piemēram, ja tas saņem pieprasījumu ar neatbalstītu metodi, piemēram, nereģistrētu PUT pieprasījumu, atļautās metodes () starpprogrammatūra automātiski nosūtīs atbilstošu atbildi (piem., 405 Metode nav atļauta).

CRUD funkcionalitātes ieviešana

Šajā apmācībā būs vienkārša uzdevumu API ar CRUD funkcionalitāti.

Izveidot a maršrutētājs.ts failu sava projekta saknes direktorijā un failam pievienojiet tālāk norādīto koda bloku:

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

Iepriekš minētais koda bloks importē un izveido Oak maršrutētāja gadījumu. Izmantojot šo gadījumu, varat izveidot maršruta apdarinātājus dažādām HTTP metodēm, izsaucot attiecīgos metožu nosaukumus (gūt, pastu, ielieciet, dzēst).

Piemēram, zemāk esošais koda bloks ir piemērs tam, kā varat izveidot GET maršruta apstrādātāju, kas atgriež visus dokumentus jūsu uzdevumu kolekcijā.

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

Lai nosūtītu atbildes objektu, izmantojot Deno, jums ir jāpiešķir atbilde.ķermenis objektu RouterContex uz atbildes objektu. Tas pats attiecas uz statusa kodiem.

Lai pievienotu citus maršruta apdarinātājus, varat tos savienot ar iepriekšējo maršruta apstrādātāju.

Tā kā:

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

Iepriekš minētais koda bloks definē GET maršruta apdarinātāju, kas atgriež vienu uzdevuma vienumu, kas atbilst id URL parametros.

Pēc tam definējiet CREATE maršruta apdarinātāju, kas jūsu kolekcijai pievieno jaunus dokumentus:

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

Pēc tam pievienojiet PUT maršruta apstrādātāju, kas atjaunina uzdevumu, pamatojoties uz id parametru, ar datiem, kas nosūtīti pieprasījuma pamattekstā.

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

Visbeidzot, izveidojiet DELETE maršruta apstrādātāju, kas noņem uzdevumu no jūsu MongoDB kolekcijas:

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

Varat palaist savu Deno lietotni ar šo komandu:

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

Pēc noklusējuma Deno skripts nevar piekļūt nekam ārpus tā darbības jomas, piemēram, tīklam vai failu sistēmai. Tātad, lai sāktu lietojumprogrammu, ir jāiekļauj dažādi karodziņi, lai piešķirtu Deno vajadzīgās atļaujas.

--allow-net ļauj Deno veikt tīkla pieprasījumus. --atļaut-lasīt ļauj Deno piekļūt failu sistēmai un lasīt failus. --allow-env ļauj Deno piekļūt vides mainīgajiem. The -- skaties karodziņš sāk jūsu lietotni Deno pulksteņa režīmā.

Migrēšana no Node.js uz Deno

Migrēšana no Node.js uz Deno, lai izveidotu REST API, var nodrošināt ievērojamas drošības, izstrādātāja produktivitātes un atkarības pārvaldības priekšrocības. Izmantojot Deno drošo izpildlaiku, vietējo TypeScript atbalstu un vienkāršotu atkarības pārvaldību, varat viegli izveidot stabilas un efektīvas REST API.

Tomēr Deno nenobriedušā ekosistēma var likt jums pārdomāt. Ja tomēr izvēlaties migrēt, rūpīgi nosveriet plusus un mīnusus.