تعرف على وقت تشغيل JS الذي يركز على الأمان من خلال مثال عملي على المشروع.

Deno هو وقت تشغيل JavaScript مبني على V8 ، وهو نفس محرك JavaScript الذي يدعم Google Chrome. أنشأ المنشئ الأصلي لـ Node.js Deno لمعالجة بعض أوجه القصور والمخاوف الأمنية في Node.js.

على الرغم من كونه جديدًا نسبيًا ، إلا أن Deno اكتسب شعبية باعتباره وقت تشغيل JavaScript آمنًا وحديثًا. إن تركيزه على الأمان ودعم ميزات اللغة الحديثة والأدوات الملائمة للمطورين يجعله خيارًا جذابًا. يمكنك استخدامه لإنشاء تطبيقات من جانب الخادم وأدوات سطر الأوامر ومشاريع JavaScript / TypeScript أخرى ، مثل واجهة برمجة تطبيقات بسيطة.

تثبيت دينو

قبل أن تتمكن من استخدام 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 إلى وحدة التحكم.

instagram viewer

إذا كنت تستخدم VS Code باعتباره IDE ، فيمكنك تنزيله ملحق Deno's VS Code لإضافة IntelliSense ، وتعزيز الإنتاجية وتجربة التطوير عند العمل مع مشاريع Deno.

بعد تثبيت الامتداد بنجاح ، قم بإنشاء ملف .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 ، الذي يعتمد على مديري الحزم مثل Node Package Manager (npm) أو الغزل ، لدى Deno نظام إدارة حزم مضمن لاستيراد وإدارة التبعيات مباشرة من عناوين URL.

على سبيل المثال ، كتلة التعليمات البرمجية أعلاه عمليات الاستيراد MongoClient من URL 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 الأصلي لدينو. كان مستوحى من Koa ، وهو عبارة عن ملف بديل لـ 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");

كتلة التعليمات البرمجية أعلاه الواردات طلب من عنوان URL لـ Oak وينشئ طبعة تطبيق (برنامج) الذي يستمع لحركة المرور الواردة على المنفذ 8000.

ال app.use (router.routes ()) يسجل line مسارات جهاز التوجيه كبرنامج وسيط في تطبيق Oak. هذا يعني أن التطبيق سيطابق المسارات المسجلة مع الطلبات الواردة ، وسيتم تشغيل المعالجات المقابلة في حالة وجود تطابق.

ال app.use (router.allowedMethods ()) يتعامل الخط مع طرق HTTP التي لم يتم تعريفها صراحة في جهاز التوجيه. على سبيل المثال ، إذا تلقى طلبًا بطريقة غير مدعومة ، على سبيل المثال ، طلب PUT غير مسجل ، طرق مسموح بها () سترسل البرامج الوسيطة تلقائيًا استجابة مناسبة (على سبيل المثال ، 405 طريقة غير مسموح بها).

تنفيذ وظيفة CRUD

سيحتوي هذا البرنامج التعليمي على واجهة برمجة تطبيقات مهام بسيطة مع وظيفة CRUD.

إنشاء جهاز التوجيه ملف في الدليل الجذر لمشروعك وأضف مقطع التعليمات البرمجية أدناه إلى ملفك:

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 ، يجب عليك تعيين استجابة كائن على 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 واحد يطابق المعرف في معلمات URL.

بعد ذلك ، حدد CREATE route handler الذي يضيف مستندات جديدة إلى مجموعتك:

.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 بإجراء طلبات الشبكة. - السماح للقراءة يسمح لـ Deno بالوصول إلى نظام الملفات وقراءة الملفات. --allow-env يسمح لـ Deno بالوصول إلى المتغيرات البيئية. ال --يشاهد العلم يبدأ تطبيق Deno في وضع الساعة.

الترحيل من Node.js إلى Deno

يمكن أن يؤدي الترحيل من Node.js إلى Deno لبناء واجهات برمجة تطبيقات REST إلى توفير أمان كبير وإنتاجية المطور ومزايا إدارة التبعية. باستخدام وقت التشغيل الآمن لـ Deno ، ودعم TypeScript الأصلي ، وإدارة التبعية المبسطة ، يمكنك بسهولة إنشاء واجهات برمجة تطبيقات REST قوية وفعالة.

ومع ذلك ، قد يتسبب النظام البيئي غير الناضج لدينو في إعادة النظر. إذا اخترت الهجرة ، فقم بوزن الإيجابيات والسلبيات بعناية.