Tutustu tähän turvallisuuteen keskittyvään JS-ajoaikaan käytännön esimerkkiprojektin avulla.

Deno on JavaScript-ajonaika, joka on rakennettu V8:lle, samalle JavaScript-moottorille, joka käyttää Google Chromea. Node.js: n alkuperäinen luoja loi Denon korjatakseen joitain Node.js: n puutteita ja turvallisuusongelmia.

Vaikka se on suhteellisen uusi, Deno on saavuttanut suosiota turvallisena ja modernina JavaScript-ajonaikana. Sen keskittyminen turvallisuuteen, nykyaikaisten kieliominaisuuksien tuki ja kehittäjäystävälliset työkalut tekevät siitä houkuttelevan valinnan. Voit käyttää sitä palvelinpuolen sovellusten, komentorivityökalujen ja muiden JavaScript/TypeScript-projektien, kuten yksinkertaisen API: n, rakentamiseen.

Denon asennus

Ennen kuin voit käyttää Denoa, sinun on ladattava ja asennettava se. Denon asennus vaihtelee käyttöjärjestelmäsi mukaan.

MacOS- ja Linux-käyttöjärjestelmissä voit asentaa Denon suorittamalla tämän komennon:

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

Windowsissa voit asentaa Denon Powershellillä käyttämällä tätä komentoa:

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

Voit varmistaa asennuksen onnistumisen suorittamalla alla olevan komennon:

deno --version

Yllä olevan komennon pitäisi tulostaa Deno-versio konsoliin.

Jos käytät VS-koodia IDE: nä, voit ladata Denon VS Code -laajennus lisätäksesi IntelliSensen, mikä parantaa tuottavuuttasi ja kehityskokemustasi työskennellessäsi Deno-projektien kanssa.

Kun laajennus on asennettu onnistuneesti, luo a .vscode kansio projektisi juurihakemistoon ja luo a settings.json tiedosto siinä.

Lisää seuraavaksi alla oleva koodilohko kohtaan settings.json tiedosto IntelliSensen käyttöönottamiseksi:

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

Yhteyden muodostaminen tietokantaan

Tässä opetusohjelmassa käytät MongoDB: tä tietokantana ylläpitääksesi tietoja API: sta.

Jos haluat yhdistää Deno-sovelluksesi MongoDB-tietokantaan, luo a db.js tiedosto projektisi juurihakemistoon ja lisää siihen alla oleva koodilohko:

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

Toisin kuin Node.js, joka riippuu pakettien ylläpitäjät kuten Node Package Manager (npm) tai lanka, Denossa on sisäänrakennettu paketinhallintajärjestelmä riippuvuuksien tuontia ja hallintaa varten suoraan URL-osoitteista.

Esimerkiksi yllä oleva koodilohko tuo MongoClient URL-osoitteesta https://deno.land/x/[email protected]/mod.ts, joka johtaa pakettiin.

Sitten käyttämällä tuotua Deno MongoDB -ohjainta (MongoClient), Deno muodostaa yhteyden sovelluksesi ja paikallisen MongoDB-tietokannan välille.

Live-skenaarioissa on turvallisempaa tallentaa tietokantasi tunnistetiedot .env tiedostoa sen sijaan, että tallennat ne pelkkänä tekstinä, kuten edellä on tehty.

Tietokantamallin luominen

Vaikka on mahdollista olla vuorovaikutuksessa MongoDB-tietokannan kanssa ilman tietokantamallia se voi johtaa jäsentämättömään ja vähemmän ylläpidettävään koodiin.

Tämän välttämiseksi luo a TodoModel.ts tiedosto projektisi juurihakemistoon ja jäsentele tietosi lisäämällä alla oleva koodilohko tiedostoon:

import db from"./db.ts";

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

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

exportdefault Todo;

Yllä oleva koodilohko määrittää rajapinnan Tehdä joka edustaa yksittäisen tehtäväkohteen rakennetta. Sitten se luo Todo-käyttöliittymän avulla Todo-kokoelman kutsumalla aiemmin luomasi MongoDB-esiintymän paljastamaa kokoelmamenetelmää.

Palvelimen luominen tammen kanssa

Oak on väliohjelmisto Denon alkuperäiselle HTTP-palvelimelle. Se on saanut inspiraationsa Koasta, joka on vaihtoehto Express.js: lle.

Luo palvelin Oakilla luomalla a main.ts tiedosto projektisi juurihakemistoon ja lisää alla oleva koodilohko tiedostoosi.

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

Yllä oleva koodilohko tuo Sovellus Oak URL -osoitteesta ja luo sovellusesiintymän (sovellus), joka kuuntelee portin 8000 saapuvaa liikennettä.

The app.use (router.routes()) line rekisteröi reitittimen reitit väliohjelmistoiksi Oak-sovelluksessa. Tämä tarkoittaa, että sovellus vastaa rekisteröityjen reittien tahtiin saapuviin pyyntöihin ja vastaavat käsittelijät ajavat, jos vastaavuus on olemassa.

The app.use (router.allowedMethods()) rivi käsittelee HTTP-menetelmiä, joita ei ole erikseen määritelty reitittimessä. Jos se esimerkiksi vastaanottaa pyynnön, jolla on ei-tuettu menetelmä, esimerkiksi rekisteröimättömän PUT-pyynnön, sallitut menetelmät () väliohjelmisto lähettää automaattisesti oikean vastauksen (esim. 405 -menetelmä ei ole sallittu).

CRUD-toiminnallisuuden käyttöönotto

Tässä opetusohjelmassa on yksinkertainen tehtäväsovellusliittymä CRUD-toiminnolla.

Luo reititin.ts tiedosto projektisi juurihakemistoon ja lisää alla oleva koodilohko tiedostoosi:

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

Yllä oleva koodilohko tuo Oak-reitittimen esiintymän ja luo sen. Tämän ilmentymän avulla voit luoda reitinkäsittelijöitä useille HTTP-menetelmille kutsumalla vastaavia menetelmänimiä (saada, lähettää, laittaa, poistaa).

Esimerkiksi alla oleva koodilohko on esimerkki siitä, kuinka voit luoda GET-reitinkäsittelijän, joka palauttaa kaikki Todo-kokoelmasi asiakirjat.

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

Jos haluat lähettää vastausobjektin Denon avulla, sinun on määritettävä vastaus.body -objekti RouterContexissa vastausobjektiin. Sama koskee tilakoodeja.

Voit lisätä muita reitinkäsittelijöitä ketjuttamalla ne edelliseen reitinkäsittelijään.

Niin kuin:

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

Yllä oleva koodilohko määrittää GET-reitinkäsittelijän, joka palauttaa yhden tehtäväkohteen, joka vastaa URL-parametreissa olevaa tunnusta.

Määritä seuraavaksi CREATE-reitinkäsittelijä, joka lisää uusia asiakirjoja kokoelmaasi:

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

Lisää seuraavaksi PUT-reitinkäsittelijä, joka päivittää Todon id parametri, pyynnön rungossa lähetetyillä tiedoilla.

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

Luo lopuksi DELETE-reitinkäsittelijä, joka poistaa tehtävän MongoDB-kokoelmastasi:

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

Voit käynnistää Deno-sovelluksesi tällä komennolla:

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

Oletusarvoisesti Deno-skripti ei voi käyttää mitään sen soveltamisalan ulkopuolella, kuten verkkoa tai tiedostojärjestelmää. Joten aloittaaksesi sovelluksesi, sinun on sisällytettävä erilaisia ​​lippuja, jotta Denolle myönnetään tarvittavat käyttöoikeudet.

--allow-net antaa Denon tehdä verkkopyyntöjä. --salli-lue antaa Denon käyttää tiedostojärjestelmää ja lukea tiedostoja. --allow-env mahdollistaa Denon pääsyn ympäristömuuttujiin. The --katsella lippu käynnistää Deno-sovelluksesi kellotilassa.

Siirtyminen Node.js: stä Denoon

Siirtyminen Node.js: sta Denoon REST-sovellusliittymien rakentamista varten voi tuoda merkittäviä tietoturva-, kehittäjien tuottavuus- ja riippuvuushallintaetuja. Käyttämällä Denon suojattua suoritusaikaa, alkuperäistä TypeScript-tukea ja yksinkertaistettua riippuvuuden hallintaa voit luoda helposti kestäviä ja tehokkaita REST-sovellusliittymiä.

Denon epäkypsä ekosysteemi voi kuitenkin saada sinut harkitsemaan uudelleen. Jos päätät siirtyä, punnita etuja ja haittoja huolellisesti.