Firebase & Supabase • المستوى الرابع • الدرس 1
العودة لفهرس المستوىالدوال السحابية بدون خادم (Firebase Cloud Functions & Supabase Edge Functions)
أهداف الدرس العلمية
- فهم مفهوم Serverless Architecture وكيف توفر التكلفة.
- كتابة Firebase Cloud Functions (HTTP + Callable + Triggers).
- استخدام Supabase Edge Functions (Deno + TypeScript).
- حماية الدوال الحساسة والتحقق من هوية المستخدم.
1. ما هي الدوال السحابية (Serverless)؟
Serverless هي بنية معمارية لا تحتاج فيها لإدارة خادم. أنت تكتب كوداً فقط، والمنصة (Firebase/Supabase) تُشغّله فقط عند الطلب وتدفع فقط مقابل الاستخدام.
Firebase Cloud Functions
- • Node.js (JavaScript/TypeScript)
- • تعمل على Google Cloud
- • تكامل عميق مع Firestore/Auth
Supabase Edge Functions
- • Deno (TypeScript)
- • تعمل على حافة الشبكة (Edge)
- • زمن استجابة أقل عالمياً
2. أنواع Firebase Cloud Functions
onRequest (HTTP)
دالة تُستدعى عبر HTTP/REST.
export const hello = onRequest(
(req, res) => {
res.send('Hi');
}
);onCall (Callable)
دالة يستدعيها SDK مباشرة من العميل.
export const add = onCall(
(req) => {
return req.data.a + req.data.b;
}
);Triggers (مستمعات)
تعمل تلقائياً عند حدث (كتابة/حذف).
onDocumentCreated(
'users/{id}',
async (event) => {...}
);Scheduled (Cron)
تعمل بجدولة زمنية (مثل التنظيف اليومي).
onSchedule('every day 03:00',
async () => {...}
);3. أمان الدوال — التحقق من الهوية
الدوال الخادمية هي المكان المثالي للعمليات الحساسة (حذف مستخدمين، تعديل صلاحيات، دفع، ...). لكن يجب التحقق من الهوية دائماً:
javascript
import { onCall, HttpsError } from "firebase-functions/v2/https";
export const sensitiveAction = onCall(async (request) => {
// 1. تحقق أن المستخدم مسجّل
if (!request.auth) {
throw new HttpsError("unauthenticated", "يجب تسجيل الدخول");
}
// 2. تحقق من صلاحية معينة
if (request.auth.token.admin !== true) {
throw new HttpsError("permission-denied", "أنت لست مشرفاً");
}
// 3. الآن يمكن تنفيذ العملية الحساسة
return { success: true };
});أخطاء HttpsError الشائعة
- •
unauthenticated— المستخدم غير مسجّل - •
permission-denied— لا يملك الصلاحية - •
invalid-argument— بيانات غير صحيحة - •
internal— خطأ داخلي
4. Supabase Edge Functions
Supabase يُقدّم Edge Functions مبنية على Deno (TypeScript). تشغيلها على الحافة (Edge) يعني استجابة أسرع للمستخدمين حول العالم.
javascript
// supabase/functions/hello/index.ts
import { serve } from "https://deno.land/std/http/server.ts";
serve(async (req) => {
const { name } = await req.json();
return new Response(
JSON.stringify({ message: `أهلاً يا ${name}` }),
{ headers: { "Content-Type": "application/json" } }
);
});
// نشر الدالة:
// npx supabase functions deploy hello
// استدعاؤها:
// const { data, error } = await supabase.functions.invoke('hello', {
// body: { name: 'أحمد' }
// });استدعاء من العميل
supabase.functions.invoke(
'hello',
{ body: { name: 'Ahmed' } }
)JWT Verification
Edge Functions تتحقق من JWT تلقائياً.
5. جدول مقارنة شامل
| الميزة | Firebase Functions | Supabase Edge |
|---|---|---|
| اللغة | Node.js (JS/TS) | Deno (TS) |
| التشغيل | Google Cloud | Edge (Global) |
| زمن الاستجابة | جيد | أسرع (Edge) |
| التكامل | عميق مع Firestore | Postgres مباشرة |
| التسعير | لكل استدعاء | لكل استدعاء |
| الاستخدام المثالي | تطبيقات Google Cloud | تطبيقات عالمية |
التطبيق العملي المباشر
تحدي الدرس الأول: بناء Cloud Functions متكاملة
قم بالتعديل على الكود بداخل المحرر أدناه لتطبيق المتطلبات التالية:
- احتفظ بدالة
helloWorldوgreetUser. - أضف دالة
addNumbers(Callable) تستقبلaوbوتُرجع مجموعهما. - أضف دالة
createUserProfileمحمية بالتحقق منrequest.auth. - أضف Trigger
onNewMessageيستمع لإنشاء رسائل جديدة في Firestore. - أضف دالة
makeAdminتستخدمsetCustomUserClaims. - اضغط "تشغيل الكود" لرؤية المخرجات.
⏳ جارٍ التحميل...