Upoznajte ovo JS runtime usmjereno na sigurnost uz praktični primjer projekta.

Deno je JavaScript runtime izgrađen na V8, istom JavaScript stroju koji pokreće Google Chrome. Izvorni kreator Node.js stvorio je Deno kako bi riješio neke od nedostataka i sigurnosnih problema Node.js.

Iako je relativno nov, Deno je stekao popularnost kao siguran i moderan JavaScript runtime. Njegov fokus na sigurnost, podrška za moderne jezične značajke i alati prilagođeni programerima čine ga privlačnim izborom. Možete ga koristiti za izradu aplikacija na strani poslužitelja, alata naredbenog retka i drugih JavaScript/TypeScript projekata, poput jednostavnog API-ja.

Instalacija Deno

Prije nego što možete koristiti Deno, morate ga preuzeti i instalirati. Instalacija Deno-a razlikuje se ovisno o vašem operativnom sustavu.

Na macOS-u i Linuxu Deno možete instalirati pokretanjem ove naredbe:

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

U sustavu Windows možete instalirati Deno s Powershellom pomoću ove naredbe:

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

Možete potvrditi da je vaša instalacija bila uspješna pokretanjem naredbe ispod:

deno --version

Gornja naredba trebala bi ispisati Deno verziju na konzolu.

Ako koristite VS Code kao IDE, možete preuzeti Deno VS Code proširenje za dodavanje IntelliSensea, poboljšavajući vašu produktivnost i razvojno iskustvo pri radu s Deno projektima.

Nakon uspješne instalacije ekstenzije, kreirajte a .vscode mapu u korijenskom direktoriju vašeg projekta i stvorite a postavke.json datoteku u njemu.

Zatim dodajte blok koda u nastavku u postavke.json datoteka za omogućavanje IntelliSense:

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

Povezivanje s bazom podataka

Za ovaj vodič, koristit ćete MongoDB kao bazu podataka za zadržavanje podataka iz vašeg API-ja.

Da biste svoju aplikaciju Deno povezali s MongoDB bazom podataka, stvorite a db.js datoteku u korijenskom direktoriju vašeg projekta i dodajte joj donji blok koda:

// 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 razliku od Node.js, koji ovisi o upravitelji paketa kao Node Package Manager (npm) ili yarn, Deno ima ugrađeni sustav upravljanja paketima za uvoz i upravljanje ovisnostima izravno s URL-ova.

Na primjer, blok koda iznad uvoza MongoClient s URL-a https://deno.land/x/[email protected]/mod.ts, koji vodi do paketa.

Zatim, koristeći uvezeni upravljački program Deno MongoDB (MongoClient), Deno uspostavlja vezu između vaše aplikacije i lokalne MongoDB baze podataka.

U scenarijima uživo, sigurnije je pohraniti vjerodajnice baze podataka u .env datoteku umjesto da ih pohranjujete u običnom tekstu, kao što je učinjeno gore.

Stvaranje modela baze podataka

Dok je moguće da se komunicirati s MongoDB bazom podataka bez modela baze podataka, to može dovesti do nestrukturiranog koda koji se teže održava.

Da biste to izbjegli, stvorite a TodoModel.ts datoteku u korijenskom direktoriju vašeg projekta i strukturirajte svoje podatke dodavanjem bloka koda u nastavku u datoteku:

import db from"./db.ts";

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

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

exportdefault Todo;

Gornji blok koda definira sučelje Napraviti koji predstavlja strukturu jedne stavke obveze. Zatim pomoću Todo sučelja stvara Todo kolekciju pozivanjem metode prikupljanja koju je izložila vaša prethodno stvorena MongoDB instanca.

Stvaranje poslužitelja s hrastom

Oak je posrednički program za Denoov izvorni HTTP poslužitelj. Inspiriran je Koom, koja je alternativa Express.js.

Za kreiranje poslužitelja s Oakom, kreirajte a glavni.ts datoteku u korijenskom direktoriju vašeg projekta i dodajte donji blok koda u svoju datoteku.

// 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 koda iznad uvozi Primjena iz Oak URL-a i stvara instancu aplikacije (aplikacija) koji osluškuje dolazni promet na portu 8000.

The app.use (router.routes()) linija registrira rute usmjerivača kao međuware u Oak aplikaciji. To znači da će aplikacija uskladiti registrirane rute s dolaznim zahtjevima, a odgovarajući rukovatelji pokrenut će se ako podudaranje postoji.

The app.use (router.allowedMethods()) linija obrađuje HTTP metode koje nisu eksplicitno definirane u usmjerivaču. Na primjer, ako primi zahtjev s nepodržanom metodom, na primjer, neregistrirani PUT zahtjev, dopuštene metode() međuprogram će automatski poslati odgovarajući odgovor (npr. 405 Metoda nije dopuštena).

Implementacija CRUD funkcionalnosti

Ovaj vodič će sadržavati jednostavan API za todo s funkcijom CRUD.

Stvoriti usmjerivač.ts datoteku u korijenskom direktoriju vašeg projekta i dodajte blok koda u nastavku u svoju datoteku:

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

Gornji blok koda uvozi i stvara instancu Oak usmjerivača. Koristeći ovu instancu, možete stvoriti rukovatelje rutama za različite HTTP metode pozivanjem odgovarajućih naziva metoda (dobiti, objaviti, staviti, izbrisati).

Na primjer, blok koda u nastavku je primjer kako možete stvoriti GET rukovatelj rutom koji vraća sve dokumente u vašoj Todo zbirci.

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

Da biste poslali objekt odgovora koristeći Deno, morate dodijeliti odgovor.tijelo objekta na RouterContexu u objekt odgovora. Isto vrijedi i za statusne kodove.

Da biste dodali druge rukovatelje rutom, možete ih povezati s prethodnim rukovateljem rute.

ovako:

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

Gornji blok koda definira GET rukovatelja rutom koji vraća jednu Todo stavku koja odgovara ID-u u URL parametrima.

Zatim definirajte rukovatelja rutom CREATE koji dodaje nove dokumente vašoj kolekciji:

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

Zatim dodajte PUT rukovatelja rutom koji ažurira Todo na temelju iskaznica parametar, s podacima poslanim u tijelu zahtjeva.

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

Konačno, stvorite DELETE rukovatelj rutom koji uklanja Todo iz vaše MongoDB kolekcije:

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

Svoju aplikaciju Deno možete pokrenuti ovom naredbom:

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

Prema zadanim postavkama, Deno skripta ne može pristupiti ničemu izvan svog opsega, poput mreže ili datotečnog sustava. Dakle, da biste pokrenuli svoju aplikaciju, morate uključiti različite zastavice kako biste Denu dodijelili potrebna dopuštenja.

--dopusti-net omogućuje Denu da postavlja mrežne zahtjeve. --dopusti-čitanje omogućuje Denu pristup datotečnom sustavu i čitanje datoteka. --dopusti-env omogućuje Denu pristup varijablama okoline. The --Gledati zastavica pokreće vašu aplikaciju Deno u načinu rada sata.

Migracija s Node.js na Deno

Migracija s Node.js na Deno za izgradnju REST API-ja može donijeti značajnu sigurnost, produktivnost programera i prednosti upravljanja ovisnostima. Koristeći Deno sigurno vrijeme izvođenja, izvornu podršku za TypeScript i pojednostavljeno upravljanje ovisnostima, možete jednostavno stvoriti robusne i učinkovite REST API-je.

Međutim, Denoov nezreli ekosustav mogao bi vas natjerati da ponovno razmislite. Ako se ipak odlučite za migraciju, pažljivo odvagnite prednosti i nedostatke.