← مسار IaGenify

الواجهة الخلفية

02 · 2–3 أسابيع

حوّل تجربة المستخدم إلى تطبيق موثوق بمنطق الخادم والهوية والبيانات.

قدّم الآن↗
Node.jsExpressMongoDB

الواجهة الخلفية، يُطبّق عبر عمل حقيقي.

حوّل تجربة المستخدم إلى تطبيق موثوق بمنطق الخادم والهوية والبيانات.

حوّل الواجهة إلى تطبيق يستجيب ويحفظ البيانات.

تنقل مرحلة الواجهة الخلفية منطق التطبيق إلى الخادم وتربطه بالبيانات الدائمة والهوية باستخدام Node.js وExpress وMongoDB.

حدّد مسؤولية الخادم

توفر الواجهة الخلفية مكاناً موثوقاً تطلب منه الواجهة تنفيذ العمل. مع Node.js وExpress ستتعرف إلى كيفية استقبال المسار للطلب وتطبيق منطق التطبيق وإرجاع استجابة مفيدة. ويساعد هذا الحد الواضح على فصل العرض عن القواعد ومعالجة البيانات.

امنح البيانات مكاناً دائماً

تعرّف MongoDB إلى تخزين البيانات بصيغة المستندات. ويشمل العمل تحديد المعلومات التي تنتمي معاً، وعلاقة السجلات بالتطبيق، وكيف يقرأها الخادم أو يحدّثها. تجعل طبقة البيانات المصممة جيداً التطبيق مفيداً بعد انتهاء جلسة المتصفح.

اربط الهوية بالوظائف المحمية

المصادقة جزء من تدفق التطبيق وليست مجرد شاشة دخول. يؤدي JWT وGoogle OAuth دورين مختلفين: يمثّل الأول جلسة مصادقاً عليها، بينما يتيح الآخر إثبات الهوية عبر Google. تجمع هذه المرحلة المسارات والبيانات والهوية في تطبيق ديناميكي.

من الفكرة إلى كود يعمل فعلياً

توضح هذه المقاطع كيف تظهر مفاهيم كل مستوى داخل المشاريع الحقيقية. إنها نقاط بداية للقراءة والتحليل والتعديل والاختبار، وليست كوداً للنسخ دون فهم.

تحقق من البيانات عند حدود الخادم

تقرأ المسارات معرّف الورشة من الرابط وتتحقق من المدخلات قبل الحفظ. وتعيد حالات HTTP مختلفة للبيانات غير الصالحة والورشة غير الموجودة والإنشاء الناجح.

router.post("/workshops/:id/registrations", async (req, res) => {
  const { name, email } = req.body;
  const workshopId = req.params.id;

  if (!name?.trim() || !/^\S+@\S+\.\S+$/.test(email ?? "")) {
    return res.status(400).json({ error: "Name and valid email required." });
  }

  const workshop = await workshops.findOne({ _id: workshopId });
  if (!workshop) return res.status(404).json({ error: "Workshop not found." });

  const registration = await registrations.insertOne({
    workshopId,
    name: name.trim(),
    email: email.toLowerCase(),
    createdAt: new Date(),
  });

  return res.status(201).json({ id: registration.insertedId });
});

اعزل التخزين داخل مستودع بيانات

يجمع المستودع عمليات MongoDB ويوفر بقية التطبيق واجهة صغيرة. يجعل ذلك المسار أوضح ويسمح بتغيير التخزين أو اختباره من مكان واحد.

export function createRegistrationRepository(db) {
  const registrations = db.collection("registrations");

  return {
    async create(input) {
      const result = await registrations.insertOne({
        workshopId: input.workshopId,
        name: input.name.trim(),
        email: input.email.toLowerCase(),
        status: "pending",
        createdAt: new Date(),
      });

      return { id: result.insertedId.toString(), status: "pending" };
    },

    findForWorkshop(workshopId) {
      return registrations.find({ workshopId }).toArray();
    },
  };
}
اقرأ ثم عدّل بنفسك

غيّر أحد المتطلبات، وتوقّع النتيجة، ثم شغّل الكود للتحقق. أثناء المراجعة، اشرح سبب اختيارك واقتراحاً للتحسين التالي.

التقنيات الأساسية
  • Node.js
  • Express
  • MongoDB
  • JWT
  • Google OAuth