Упознајте ово ЈС рунтиме фокусирано на безбедност са практичним примером пројекта.

Дено је ЈаваСцрипт рунтиме изграђен на В8, истом ЈаваСцрипт мотору који покреће Гоогле Цхроме. Оригинални креатор Ноде.јс-а креирао је Дено да би се позабавио неким недостацима и безбедносним проблемима Ноде.јс-а.

Иако је релативно нов, Дено је стекао популарност као безбедно и модерно ЈаваСцрипт рунтиме. Његов фокус на безбедност, подршка за модерне језичке функције и алати прилагођени програмерима чине га привлачним избором. Можете га користити за прављење апликација на страни сервера, алата командне линије и других ЈаваСцрипт/ТипеСцрипт пројеката, попут једноставног АПИ-ја.

Инсталирање Дено-а

Пре него што будете могли да користите Дено, морате да га преузмете и инсталирате. Дено-ова инсталација варира у зависности од вашег оперативног система.

На мацОС и Линук, можете инсталирати Дено тако што ћете покренути ову команду:

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

На Виндовс-у, можете инсталирати Дено са Поверсхелл-ом, користећи ову команду:

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

Можете потврдити да је ваша инсталација била успешна тако што ћете покренути наредбу испод:

deno --version

Горња команда би требало да одштампа Дено верзију на конзоли.

Ако користите ВС Цоде као ИДЕ, можете преузети Дено'с ВС Цоде екстензија да додате ИнтеллиСенсе, побољшавајући вашу продуктивност и развојно искуство када радите са Дено пројектима.

Након успешног инсталирања проширења, креирајте а .всцоде фолдер у основном директоријуму вашег пројекта и креирајте а сеттингс.јсон фајл у њему.

Затим додајте блок кода испод у сеттингс.јсон датотеку да бисте омогућили ИнтеллиСенсе:

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

Повезивање са базом података

За овај водич, користићете МонгоДБ као базу података за задржавање података из вашег АПИ-ја.

Да бисте повезали своју Дено апликацију са МонгоДБ базом података, креирајте а дб.јс датотеку у основном директоријуму вашег пројекта и додајте блок кода у наставку:

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

За разлику од Ноде.јс, који зависи од менаџери пакета као Ноде Пацкаге Манагер (нпм) или иарн, Дено има уграђени систем за управљање пакетима за увоз и управљање зависностима директно са УРЛ адреса.

На пример, блок кода изнад увоза МонгоЦлиент са УРЛ адресе https://deno.land/x/[email protected]/mod.ts, што води до пакета.

Затим, користећи увезени драјвер Дено МонгоДБ (МонгоЦлиент), Дено успоставља везу између ваше апликације и локалне МонгоДБ базе података.

У живим сценаријима, сигурније је чувати акредитиве базе података у .енв датотеку уместо да их чувате у обичном тексту, као што је горе урађено.

Креирање модела базе података

Док је могуће да се интеракцију са МонгоДБ базом података без модела базе података, то може довести до неструктурираног кода и кода који се мање одржава.

Да бисте то избегли, креирајте а ТодоМодел.тс датотеку у основном директоријуму вашег пројекта и структурирајте своје податке додавањем блока кода испод у датотеку:

import db from"./db.ts";

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

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

exportdefault Todo;

Блок кода изнад дефинише интерфејс Урадити који представља структуру једне ставке задатака. Затим, користећи Тодо интерфејс, креира Тодо колекцију позивањем методе колекције коју је открила ваша претходно креирана МонгоДБ инстанца.

Креирање сервера са храстом

Оак је међувера за Дено-ов изворни ХТТП сервер. Инспирисано је Коом, што је ан алтернатива Екпресс.јс.

Да бисте креирали сервер са Оак-ом, креирајте а маин.тс датотеку у основном директоријуму вашег пројекта и додајте блок кода испод у своју датотеку.

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

Блок кода изнад увози Апликација са Оак УРЛ адресе и креира инстанцу апликације (апликација) који слуша долазни саобраћај на порту 8000.

Тхе апп.усе (роутер.роутес()) линија региструје руте рутера као средњи софтвер у апликацији Оак. То значи да ће апликација ускладити регистроване руте са долазним захтевима, а одговарајући руковаоци ће се покренути ако постоји подударање.

Тхе апп.усе (роутер.алловедМетходс()) линија рукује ХТТП методама које нису експлицитно дефинисане у рутеру. На пример, ако прими захтев са неподржаним методом, на пример, нерегистровани ПУТ захтев, дозвољене методе() средњи софтвер ће аутоматски послати одговарајући одговор (нпр. 405 Метод није дозвољен).

Имплементација ЦРУД функционалности

Овај водич ће садржати једноставан АПИ задатака са ЦРУД функционалношћу.

Створити роутер.тс датотеку у основном директоријуму вашег пројекта и додајте блок кода испод у своју датотеку:

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

Блок кода изнад увози и креира инстанцу Оак рутера. Користећи ову инстанцу, можете креирати руковаоце рутама за различите ХТТП методе позивањем одговарајућих имена метода (добити, пошта, ставити, избрисати).

На пример, блок кода испод је пример како можете да креирате ГЕТ руковалац руте који враћа све документе у вашој Тодо колекцији.

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

Да бисте послали објекат одговора користећи Дено, морате доделити одговор.тело објекат на РоутерЦонтек-у на објекат одговора. Исто важи и за статусне кодове.

Да бисте додали друге руковаоце рутама, можете их повезати са претходним руковаоцима рутама.

Овако:

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

Блок кода изнад дефинише ГЕТ руковалац руте који враћа једну Тодо ставку која одговара ИД-у у УРЛ параметрима.

Затим дефинишите ЦРЕАТЕ руковалац руте који додаје нове документе вашој колекцији:

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

Затим додајте ПУТ руковалац руте који ажурира Тодо на основу ид параметар, са подацима послатим у телу захтева.

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

Коначно, креирајте руковалац руте ДЕЛЕТЕ који уклања Тодо из ваше МонгоДБ колекције:

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

Можете покренути своју Дено апликацију са овом командом:

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

Подразумевано, Дено скрипта не може приступити ничему изван свог делокруга, као што је мрежа или систем датотека. Дакле, да бисте покренули своју апликацију, морате укључити различите заставице да бисте Дено-у доделили потребне дозволе.

--аллов-нет омогућава Дено-у да поставља мрежне захтеве. --допусти-читање омогућава Дено-у да приступи систему датотека и чита датотеке. --аллов-енв омогућава Дено-у да приступи променљивим окружења. Тхе --гледати флаг покреће вашу Дено апликацију у режиму сата.

Миграција са Ноде.јс на Дено

Прелазак са Ноде.јс на Дено за прављење РЕСТ АПИ-ја може донети значајне предности у погледу безбедности, продуктивности програмера и управљања зависношћу. Користећи Дено безбедно време извођења, изворну подршку за ТипеСцрипт и поједностављено управљање зависношћу, можете лако да креирате робусне и ефикасне РЕСТ АПИ-је.

Међутим, Деноов незрели екосистем може вас навести да се преиспитате. Ако одлучите да мигрирате, пажљиво одмерите предности и недостатке.