एक व्यावहारिक उदाहरण प्रोजेक्ट के साथ इस सुरक्षा-केंद्रित जेएस रनटाइम को जानें।

डेनो एक जावास्क्रिप्ट रनटाइम है जिसे V8 पर बनाया गया है, वही जावास्क्रिप्ट इंजन जो Google Chrome को पावर देता है। Node.js के मूल निर्माता ने Node.js की कुछ कमियों और सुरक्षा चिंताओं को दूर करने के लिए Deno का निर्माण किया।

यद्यपि यह अपेक्षाकृत नया है, डेनो ने एक सुरक्षित और आधुनिक जावास्क्रिप्ट रनटाइम के रूप में लोकप्रियता हासिल की है। सुरक्षा पर इसका ध्यान, आधुनिक भाषा सुविधाओं के लिए समर्थन और डेवलपर-अनुकूल उपकरण इसे एक आकर्षक विकल्प बनाते हैं। आप इसका उपयोग एक साधारण एपीआई की तरह सर्वर-साइड एप्लिकेशन, कमांड-लाइन टूल और अन्य जावास्क्रिप्ट/टाइपस्क्रिप्ट प्रोजेक्ट बनाने के लिए कर सकते हैं।

डेनो स्थापित करना

डेनो का उपयोग करने से पहले आपको इसे डाउनलोड और इंस्टॉल करना होगा। डेनो की स्थापना आपके ऑपरेटिंग सिस्टम के आधार पर भिन्न होती है।

MacOS और Linux पर, आप यह कमांड चलाकर Deno इंस्टॉल कर सकते हैं:

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

विंडोज़ पर, आप इस कमांड का उपयोग करके पावरशेल के साथ डेनो इंस्टॉल कर सकते हैं:

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

आप नीचे दिए गए आदेश को चलाकर पुष्टि कर सकते हैं कि आपका इंस्टॉलेशन सफल रहा:

deno --version

उपरोक्त आदेश को डेनो संस्करण को कंसोल पर प्रिंट करना चाहिए।

यदि आप वीएस कोड को आईडीई के रूप में उपयोग करते हैं, तो आप डाउनलोड कर सकते हैं डेनो का वीएस कोड एक्सटेंशन डेनो परियोजनाओं के साथ काम करते समय अपनी उत्पादकता और विकास अनुभव को बढ़ाने के लिए IntelliSense जोड़ें।

एक्सटेंशन को सफलतापूर्वक इंस्टॉल करने के बाद, एक बनाएं .vscode अपने प्रोजेक्ट की रूट डायरेक्टरी में फ़ोल्डर बनाएं और एक बनाएं सेटिंग्स.json इसमें फ़ाइल करें.

इसके बाद, नीचे दिए गए कोड ब्लॉक को इसमें जोड़ें सेटिंग्स.json IntelliSense सक्षम करने के लिए फ़ाइल:

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

किसी डेटाबेस से कनेक्ट करना

इस ट्यूटोरियल के लिए, आप अपने एपीआई से डेटा को जारी रखने के लिए डेटाबेस के रूप में MongoDB का उपयोग करेंगे।

अपने Deno ऐप को MongoDB डेटाबेस से कनेक्ट करने के लिए, एक बनाएं db.js अपने प्रोजेक्ट रूट डायरेक्टरी में फ़ाइल करें और नीचे दिए गए कोड ब्लॉक को इसमें जोड़ें:

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

Node.js के विपरीत, जो निर्भर करता है पैकेज प्रबंधक नोड पैकेज मैनेजर (एनपीएम) या यार्न की तरह, डेनो में यूआरएल से सीधे निर्भरता आयात और प्रबंधित करने के लिए एक अंतर्निहित पैकेज प्रबंधन प्रणाली है।

उदाहरण के लिए, आयात के ऊपर कोड ब्लॉक मोंगोक्लाइंट यूआरएल से https://deno.land/x/[email protected]/mod.ts, जो पैकेज की ओर ले जाता है।

फिर, आयातित Deno MongoDB ड्राइवर का उपयोग करके (मोंगोक्लाइंट), डेनो आपके एप्लिकेशन और स्थानीय MongoDB डेटाबेस के बीच एक कनेक्शन स्थापित करता है।

लाइव परिदृश्यों में, अपने डेटाबेस क्रेडेंशियल्स को संग्रहीत करना अधिक सुरक्षित है .env जैसा कि ऊपर किया गया है, उन्हें सादे पाठ में संग्रहीत करने के बजाय फ़ाइल करें।

एक डेटाबेस मॉडल बनाना

जबकि यह संभव है MongoDB डेटाबेस के साथ इंटरैक्ट करें डेटाबेस मॉडल के बिना, ऐसा करने से कोड असंरचित और कम रखरखाव योग्य हो सकता है।

इससे बचने के लिए एक बनाएं TodoModel.ts अपने प्रोजेक्ट की रूट निर्देशिका में फ़ाइल करें और फ़ाइल में नीचे दिए गए कोड ब्लॉक को जोड़कर अपने डेटा को संरचित करें:

import db from"./db.ts";

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

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

exportdefault Todo;

उपरोक्त कोड ब्लॉक एक इंटरफ़ेस को परिभाषित करता है करने के लिए यह एकल कार्य आइटम की संरचना का प्रतिनिधित्व करता है। फिर टोडो इंटरफ़ेस का उपयोग करके, यह आपके पहले बनाए गए MongoDB उदाहरण द्वारा उजागर संग्रह विधि को कॉल करके एक टोडो संग्रह बनाता है।

ओक के साथ एक सर्वर बनाना

ओक डेनो के मूल HTTP सर्वर के लिए एक मिडलवेयर है। यह कोआ से प्रेरित था, जो एक है Express.js का विकल्प.

ओक के साथ एक सर्वर बनाने के लिए, एक बनाएं मुख्य.ts अपने प्रोजेक्ट रूट डायरेक्टरी में फ़ाइल करें और नीचे दिए गए कोड ब्लॉक को अपनी फ़ाइल में जोड़ें।

// 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 पर आने वाले ट्रैफ़िक को सुनता है।

ऐप.यूज़ (राउटर.रूट्स()) लाइन ओक एप्लिकेशन में राउटर के मार्गों को मिडलवेयर के रूप में पंजीकृत करती है। इसका मतलब यह है कि एप्लिकेशन आने वाले अनुरोधों के विरुद्ध पंजीकृत मार्गों से मेल खाएगा, और यदि कोई मिलान मौजूद है तो संबंधित हैंडलर चलेंगे।

ऐप.उपयोग (राउटर.अनुमतिविधि()) लाइन HTTP विधियों को संभालती है जो राउटर में स्पष्ट रूप से परिभाषित नहीं हैं। उदाहरण के लिए, यदि इसे किसी असमर्थित विधि से अनुरोध प्राप्त होता है, उदाहरण के लिए, एक अपंजीकृत PUT अनुरोध, तो अनुमति विधियाँ() मिडलवेयर स्वचालित रूप से एक उचित प्रतिक्रिया भेजेगा (उदाहरण के लिए, 405 विधि की अनुमति नहीं है).

सीआरयूडी कार्यक्षमता को कार्यान्वित करना

इस ट्यूटोरियल में सीआरयूडी कार्यक्षमता के साथ एक सरल टूडू एपीआई की सुविधा होगी।

एक बनाने के राऊटर.ts अपने प्रोजेक्ट की रूट डायरेक्टरी में फ़ाइल करें और नीचे दिए गए कोड ब्लॉक को अपनी फ़ाइल में जोड़ें:

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

ऊपर का कोड ब्लॉक आयात करता है और ओक राउटर का एक उदाहरण बनाता है। इस उदाहरण का उपयोग करके, आप संबंधित विधि नामों को कॉल करके विभिन्न HTTP विधियों के लिए रूट हैंडलर बना सकते हैं (पाना, डाक, रखना, मिटाना).

उदाहरण के लिए, नीचे दिया गया कोड ब्लॉक इस बात का उदाहरण है कि आप एक GET रूट हैंडलर कैसे बना सकते हैं जो आपके टोडो संग्रह में सभी दस्तावेज़ लौटाता है।

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

डेनो का उपयोग करके एक प्रतिक्रिया ऑब्जेक्ट भेजने के लिए, आपको असाइन करना होगा प्रतिक्रिया.शरीर प्रतिक्रिया ऑब्जेक्ट पर RouterContex पर ऑब्जेक्ट। यही बात स्टेटस कोड पर भी लागू होती है।

अन्य रूट हैंडलर जोड़ने के लिए, आप उन्हें पिछले रूट हैंडलर से जोड़ सकते हैं।

जैसे इतना:

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

उपरोक्त कोड ब्लॉक एक GET रूट हैंडलर को परिभाषित करता है जो एक एकल टोडो आइटम लौटाता है जो यूआरएल पैरामीटर में आईडी से मेल खाता है।

इसके बाद, एक क्रिएट रूट हैंडलर को परिभाषित करें जो आपके संग्रह में नए दस्तावेज़ जोड़ता है:

.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 रूट हैंडलर जोड़ें जो इसके आधार पर टोडो को अपडेट करता है पहचान पैरामीटर, अनुरोध निकाय में भेजे गए डेटा के साथ।

.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 रूट हैंडलर बनाएं जो आपके MongoDB संग्रह से एक Todo को हटा दे:

.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

डिफ़ॉल्ट रूप से, एक डेनो स्क्रिप्ट अपने दायरे से बाहर किसी भी चीज़, जैसे नेटवर्क या फ़ाइल सिस्टम, तक नहीं पहुंच सकती है। इसलिए अपना एप्लिकेशन शुरू करने के लिए, आपको डेनो को आवश्यक अनुमतियां प्रदान करने के लिए विभिन्न झंडे शामिल करने होंगे।

--allow-net डेनो को नेटवर्क अनुरोध करने की अनुमति देता है। --अनुमति दें-पढ़ें डेनो को फ़ाइल सिस्टम तक पहुँचने और फ़ाइलें पढ़ने की अनुमति देता है। --allow-env डेनो को पर्यावरण चरों तक पहुँचने की अनुमति देता है। --घड़ी फ़्लैग आपके डेनो ऐप को वॉच मोड में प्रारंभ करता है।

Node.js से डेनो की ओर पलायन

REST API के निर्माण के लिए Node.js से Deno में माइग्रेट करने से महत्वपूर्ण सुरक्षा, डेवलपर उत्पादकता और निर्भरता प्रबंधन लाभ मिल सकते हैं। डेनो के सुरक्षित रनटाइम, देशी टाइपस्क्रिप्ट समर्थन और सरलीकृत निर्भरता प्रबंधन का उपयोग करके, आप आसानी से मजबूत और कुशल REST API बना सकते हैं।

हालाँकि, डेनो का अपरिपक्व पारिस्थितिकी तंत्र आपको पुनर्विचार करने पर मजबूर कर सकता है। यदि आप प्रवास करना चुनते हैं, तो फायदे और नुकसान पर सावधानी से विचार करें।