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:
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.