Tutvuge selle turbekeskse JS-i käitusajaga praktilise näidisprojekti abil.

Deno on JavaScripti käituskeskkond, mis on üles ehitatud V8-le, samale JavaScripti mootorile, mis toidab Google Chrome'i. Node.js'i algne looja lõi Deno, et lahendada mõned Node.js'i puudused ja turvaprobleemid.

Kuigi see on suhteliselt uus, on Deno kogunud populaarsust turvalise ja kaasaegse JavaScripti käituskeskkonnana. Selle keskendumine turvalisusele, kaasaegsete keelefunktsioonide tugi ja arendajasõbralikud tööriistad muudavad selle ahvatlevaks valikuks. Saate seda kasutada serveripoolsete rakenduste, käsureatööriistade ja muude JavaScripti/TypeScripti projektide (nt lihtsa API) loomiseks.

Deno installimine

Enne Deno kasutamist peate selle alla laadima ja installima. Deno installimine sõltub teie operatsioonisüsteemist.

MacOS-is ja Linuxis saate Deno installida, käivitades selle käsu:

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

Windowsis saate installida Deno koos Powershelliga, kasutades seda käsku:

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

Saate kinnitada, et teie installimine oli edukas, käivitades alloleva käsu:

deno --version

Ülaltoodud käsk peaks printima konsooli Deno versiooni.

Kui kasutate IDE-na VS-koodi, saate alla laadida Deno VS-koodi laiendus IntelliSense'i lisamiseks, suurendades teie tootlikkust ja arenduskogemust Deno projektidega töötamisel.

Pärast laienduse edukat installimist looge a .vscode kausta oma projekti juurkataloogis ja looge a settings.json faili selles.

Järgmisena lisage allolev koodiplokk settings.json fail IntelliSense'i lubamiseks:

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

Andmebaasiga ühenduse loomine

Selle õpetuse jaoks kasutate oma API-st andmete säilitamiseks andmebaasina MongoDB-d.

Deno rakenduse ühendamiseks MongoDB andmebaasiga looge a db.js faili oma projekti juurkataloogi ja lisage sellele allolev koodiplokk:

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

Erinevalt Node.js-st, mis sõltub paketihaldurid nagu Node Package Manager (npm) või lõng, on Denol sisseehitatud paketihaldussüsteem sõltuvuste importimiseks ja haldamiseks otse URL-idest.

Näiteks ülaltoodud koodiplokk impordib MongoClient URL-ist https://deno.land/x/[email protected]/mod.ts, mis viib paki juurde.

Seejärel kasutades imporditud Deno MongoDB draiverit (MongoClient), loob Deno ühenduse teie rakenduse ja kohaliku MongoDB andmebaasi vahel.

Reaalajas stsenaariumide korral on turvalisem salvestada andmebaasi mandaadid .env faili, selle asemel, et neid lihttekstina salvestada, nagu eespool tehtud.

Andmebaasimudeli loomine

Kuigi on võimalik suhelda MongoDB andmebaasiga ilma andmebaasi mudelita võib see kaasa tuua struktureerimata ja vähem hooldatava koodi.

Selle vältimiseks looge a TodoModel.ts faili oma projekti juurkataloogi ja struktureerige oma andmed, lisades failile alloleva koodiploki:

import db from"./db.ts";

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

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

exportdefault Todo;

Ülaltoodud koodiplokk määratleb liidese Tegema mis esindab ühe ülesandeüksuse struktuuri. Seejärel loob see Todo liidese abil Todo kogu, kutsudes välja kogumismeetodi, mille paljastas teie varem loodud MongoDB eksemplar.

Serveri loomine tammega

Oak on Deno loomuliku HTTP-serveri vahevara. See oli inspireeritud Koast, mis on alternatiiv Express.js-ile.

Tamme abil serveri loomiseks looge a main.ts faili oma projekti juurkataloogi ja lisage oma failile allolev koodiplokk.

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

Eespool olev koodiplokk impordib Rakendus Oak URL-ist ja loob rakenduse eksemplari (rakendus), mis kuulab pordi 8000 sissetulevat liiklust.

The app.use (ruuter.routes()) line registreerib ruuteri marsruudid vahevarana Oak rakenduses. See tähendab, et rakendus võrdleb registreeritud marsruutide tahet sissetulevate päringute vastu ja vastavad töötlejad käivituvad, kui vaste on olemas.

The app.use (ruuter.allowedMethods()) rida käsitleb HTTP-meetodeid, mis pole ruuteris selgesõnaliselt määratletud. Näiteks kui ta saab päringu toetamata meetodiga, näiteks registreerimata PUT-päringu, lubatud meetodid () vahevara saadab automaatselt sobiva vastuse (nt 405 Meetod pole lubatud).

CRUD-i funktsionaalsuse rakendamine

See õpetus sisaldab lihtsat ülesannete API-t koos CRUD-funktsiooniga.

Loo ruuter.ts faili oma projekti juurkataloogi ja lisage oma failile allolev koodiplokk:

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

Ülaltoodud koodiplokk impordib ja loob Oak ruuteri eksemplari. Seda eksemplari kasutades saate luua erinevate HTTP-meetodite jaoks marsruudikäsitlejaid, kutsudes välja vastava meetodi nime (saada, postitus, pane, kustutada).

Näiteks allolev koodiplokk on näide sellest, kuidas saate luua GET-marsruudi töötleja, mis tagastab kõik teie Todo kogus olevad dokumendid.

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

Deno abil vastuseobjekti saatmiseks peate määrama vastus.keha RouterContexi objekt vastuseobjektile. Sama kehtib ka olekukoodide kohta.

Teiste marsruudihaldurite lisamiseks saate need eelmise marsruudihalduriga aheldada.

Nagu nii:

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

Ülaltoodud koodiplokk määratleb GET-marsruudi töötleja, mis tagastab ühe ülesandeüksuse, mis vastab URL-i parameetrites olevale ID-le.

Järgmisena määratlege marsruuditöötleja CREATE, mis lisab teie kogusse uusi 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,
};
}
})

Järgmisena lisage PUT-marsruudi töötleja, mis värskendab ülesandeid selle põhjal id parameeter koos päringu kehasse saadetud andmetega.

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

Lõpuks looge marsruudihaldur DELETE, mis eemaldab teie MongoDB kogust ülesande:

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

Saate oma Deno rakenduse käivitada selle käsuga:

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

Vaikimisi ei pääse Deno skript juurde millelegi väljaspool selle ulatust, näiteks võrgule või failisüsteemile. Seega peate rakenduse käivitamiseks lisama erinevaid lippe, et anda Denole nõutavad õigused.

--allow-net võimaldab Denol teha võrgupäringuid. --luba-lugeda võimaldab Denol juurdepääsu failisüsteemile ja failide lugemist. --allow-env võimaldab Denol juurdepääsu keskkonnamuutujatele. The --vaata lipp käivitab teie Deno rakenduse kellarežiimis.

Migreerimine Node.js-ilt Denole

REST API-de loomiseks Node.js-ilt Denole üleminek võib tuua olulisi turvalisuse, arendaja tootlikkuse ja sõltuvuse haldamise eeliseid. Deno turvalist käitusaega, natiivset TypeScripti tuge ja lihtsustatud sõltuvushaldust kasutades saate hõlpsasti luua tugevaid ja tõhusaid REST API-sid.

Kuid Deno ebaküps ökosüsteem võib panna teid ümber mõtlema. Kui otsustate migratsiooni, kaaluge hoolikalt plusse ja miinuseid.