הכירו את זמן הריצה של JS ממוקד אבטחה עם פרויקט דוגמה מעשי.

Deno הוא זמן ריצה של JavaScript בנוי על V8, אותו מנוע JavaScript שמניע את Google Chrome. היוצר המקורי של Node.js יצר את Deno כדי לטפל בחלק מהחסרונות ודאגות האבטחה של Node.js.

למרות שהוא חדש יחסית, Deno צבר פופולריות כזמן ריצה מאובטח ומודרני של JavaScript. ההתמקדות שלו באבטחה, תמיכה בתכונות שפה מודרניות וכלים ידידותיים למפתחים הופכים אותה לבחירה מושכת. אתה יכול להשתמש בו כדי לבנות יישומים בצד השרת, כלי שורת פקודה ופרויקטים אחרים של JavaScript/TypeScript, כמו ממשק API פשוט.

מתקין את Deno

לפני שתוכל להשתמש ב-Deno, עליך להוריד ולהתקין אותו. ההתקנה של Deno משתנה בהתאם למערכת ההפעלה שלך.

ב-macOS ו-Linux, אתה יכול להתקין את Deno על ידי הפעלת הפקודה הזו:

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

ב-Windows, אתה יכול להתקין את Deno עם Powershell, באמצעות פקודה זו:

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

אתה יכול לאשר שההתקנה שלך הצליחה על ידי הפעלת הפקודה למטה:

deno --version

הפקודה למעלה צריכה להדפיס את גרסת ה-Deno לקונסולה.

אם אתה משתמש בקוד VS בתור IDE, אתה יכול להוריד

instagram viewer
תוסף VS Code של Deno כדי להוסיף את IntelliSense, שיפור הפרודוקטיביות וחוויית הפיתוח שלך בעבודה עם פרויקטים של Deno.

לאחר התקנת התוסף בהצלחה, צור א .vscode תיקיה בספריית השורש של הפרויקט שלך וצור א settings.json קובץ בו.

לאחר מכן, הוסף את בלוק הקוד למטה ל- settings.json קובץ כדי לאפשר את IntelliSense:

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

התחברות למסד נתונים

עבור מדריך זה, תשתמש ב- MongoDB כמסד נתונים כדי להתמיד בנתונים מהממשק ה-API שלך.

כדי לחבר את אפליקציית 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, שתלוי ב מנהלי חבילות כמו מנהל חבילות הצומת (npm) או חוט, ל-Deno יש מערכת ניהול חבילות מובנית לייבוא ​​וניהול תלות ישירות מכתובות URL.

לדוגמה, בלוק הקוד שלמעלה מייבא MongoClient מכתובת האתר https://deno.land/x/[email protected]/mod.ts, מה שמוביל לחבילה.

לאחר מכן, באמצעות מנהל ההתקן המיובא Deno MongoDB (MongoClient), Deno יוצר חיבור בין האפליקציה שלך למסד נתונים מקומי של 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;

בלוק הקוד למעלה מגדיר ממשק לעשות המייצג את המבנה של פריט מטלה בודד. לאחר מכן באמצעות ממשק Todo, הוא יוצר אוסף Todo על ידי קריאה לשיטת האיסוף שנחשפה על ידי מופע MongoDB שיצרת בעבר.

יצירת שרת עם אלון

Oak היא תוכנת ביניים עבור שרת ה-HTTP המקורי של Deno. הוא נוצר בהשראת קואה, שהוא an חלופה ל-Express.js.

כדי ליצור שרת עם Oak, צור א main.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");

בלוק הקוד שלמעלה מייבא יישום מ-Oak URL ויוצר מופע יישום (אפליקציה) שמאזין לתנועה נכנסת ביציאה 8000.

ה app.use (router.routes()) line רושם את מסלולי הנתב כתווך באפליקציית Oak. המשמעות היא שהאפליקציה תתאים את המסלולים הרשומים מול בקשות נכנסות, והמטפלים המתאימים יפעלו אם קיימת התאמה.

ה app.use (router.allowedMethods()) line מטפל בשיטות HTTP שאינן מוגדרות במפורש בנתב. לדוגמה, אם הוא מקבל בקשה עם שיטה לא נתמכת, למשל, בקשת PUT לא רשומה, מותרMethods() תוכנת האמצע תשלח באופן אוטומטי תגובה מתאימה (למשל, שיטת 405 אינה מותרת).

יישום פונקציונליות CRUD

מדריך זה יכלול ממשק API פשוט לביצוע עם פונקציונליות CRUD.

ליצור router.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

בלוק הקוד שלמעלה מייבא ויוצר מופע של נתב Oak. באמצעות מופע זה, אתה יכול ליצור מטפלי מסלולים עבור שיטות HTTP שונות על ידי קריאה לשמות השיטה המתאימים (לקבל, הודעה, לָשִׂים, לִמְחוֹק).

לדוגמה, בלוק הקוד שלהלן הוא דוגמה לאופן שבו אתה יכול ליצור מטפל בנתיב GET שמחזיר את כל המסמכים באוסף ה-Todo שלך.

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

כדי לשלוח אובייקט תגובה באמצעות Deno, עליך להקצות את response.body אובייקט ב-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 שמחזיר פריט Todo בודד התואם את המזהה בפרמטרים של כתובת האתר.

לאחר מכן, הגדר מטפל במסלול CREATE שמוסיף מסמכים חדשים לאוסף שלך:

.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 שמעדכן Todo בהתבסס על תְעוּדַת זֶהוּת פרמטר, עם הנתונים שנשלחו בגוף הבקשה.

.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 שמסיר Todo מאוסף MongoDB שלך:

.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 שלך עם הפקודה הזו:

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

כברירת מחדל, סקריפט Deno אינו יכול לגשת לשום דבר מחוץ להיקפו, כגון הרשת או מערכת הקבצים. אז כדי להתחיל את הבקשה שלך, עליך לכלול דגלים שונים כדי להעניק לדינו את ההרשאות הנדרשות.

--לאפשר-נטו מאפשר ל-Deno לבצע בקשות רשת. --לאפשר לקרוא מאפשר ל-Deno לגשת למערכת הקבצים ולקרוא קבצים. --allow-env מאפשר ל-Deno לגשת למשתנים סביבתיים. ה --שעון הדגל מפעיל את אפליקציית Deno שלך במצב שעון.

מעבר מ-Node.js ל-Deno

מעבר מ-Node.js ל-Deno לבניית ממשקי API של REST יכולה להביא יתרונות משמעותיים לאבטחה, פרודוקטיביות מפתחים וניהול תלות. באמצעות זמן הריצה המאובטח של Deno, התמיכה המקורית ב-TypeScript וניהול התלות הפשוט, אתה יכול ליצור בקלות ממשקי API של REST חזקים ויעילים.

עם זאת, המערכת האקולוגית הלא בוגרת של דנו עלולה לגרום לך לשקול מחדש. אם תבחר להגר, שקל את היתרונות והחסרונות בזהירות.