شعار أوراباسي
aurabaseمستندات
مستندات›Edge Functions›Invoke a function

استدعاء وظيفة

كيفية استدعاء وظيفة منشورة باستخدام JavaScript SDK أو عبر HTTP، وكيف تعرف وظيفتك من المتصل.

8 د قراءة·المستوى وسيطة·تمت المراجعة في 12‏/10‏/2026
تم إنشاء هذا النص الإنجليزي تلقائيًا من النص الأصلي الفرنسي ولم تتم مراجعته بعد.
تمت ترجمة هذه الصفحة تلقائيًا. النسخة الإنجليزية موثوقة.
#
SDK

1. اتصل من SDK

invoke هي المكالمة الوحيدة التي يمكن للمفتاح العام إجراؤها. إنه يعمل بنفس الطريقة في المتصفح وعلى الخادم.

src/lib/call.tstypescript
import { createClient } from '@aurabase/aurabase-js'

const aura = createClient(process.env.AURA_URL!, process.env.AURA_ANON_KEY!)

const { data, error } = await aura.functions.invoke<{ greeting: string }>('hello', {
  body: { name: 'Ada' },
})
if (error) throw error
console.log(data?.greeting)
src/lib/call-as-user.tstypescript
// بعد تسجيل الدخول، تضيف SDK JWT للمستخدم إلى كل مكالمة: بدون رمز إضافي.
await aura.auth.signInWithPassword({ email, password })
const { data } = await aura.functions.invoke('whoami')
// ترى الوظيفة دور x-aura: المصادقة ومعرف المستخدم.

النوع العام invoke<T> يكتب الاستجابة فقط. لا يتم التحقق من الاسم والنص في وقت الترجمة.

يمكن للمفتاح العام الاستدعاء فقط

list, get, listJobs, enqueueJob وطرق الإدارة الأخرى تحتاج إلى مفتاح service_role وتنتمي إلى الخادم الخاص بك. يستقبل المفتاح العام 403. راجع من يمكنه الاتصال بـ.

#
طلب

2. قم بوصف الطلب

تتلقى وظيفتك تمامًا الطلب الذي تصفه، وليس غلافًا حوله.

الخيارالافتراضيما تراه الوظيفة
methodPOSTreq.method
path/new URL(req.url).pathname
headersلا شيءreq.headers، باستثناء رؤوس النظام الأساسي المدرجة أدناه
bodyلا شيءawait req.json() (أو req.text() لسلسلة)
timeoutافتراضي العميل (30 ثانية)غير مرئي: يلغي مكالمتك
signalلا شيءغير مرئي: يلغي مكالمتك
responseType'json'غير مرئي: كيف يقوم SDK بفك تشفير الاستجابة، راجع استجابات غير JSON
request.tstypescript
await aura.functions.invoke('items', {
  method: 'PUT',
  path: '/items/1',
  headers: { 'x-source': 'dashboard' },
  body: { qty: 2 },
})
aurabase/functions/items/index.tstypescript
Deno.serve(async (req) => {
  const url = new URL(req.url)          // اسم المسار: '/العناصر/1'
  const source = req.headers.get('x-source') // "لوحة القيادة"
  const body = await req.json()         // { الكمية: 2 }
  return Response.json({ method: req.method, id: url.pathname.split('/').pop(), source, body })
})

قواعد تستحق المعرفة:

  • يتم إرسال GET وHEAD بدون نص.
  • يتم إرسال النص الذي ليس سلسلة كـ JSON، مع content-type: application/json ما لم تقم بتعيين واحد. يتم إرسال نص السلسلة كما هو ويتم الحصول عليه أيضًا content-type: application/json، لذا اقرأه مع req.text().
  • مع عدم وجود body، تتلقى الوظيفة طلبًا بدون نص. رمية await req.json() عارية، لذا اكتب await req.json().catch(() => ({})) عندما يمكن إجراء المكالمة بدون حمولة.
  • يجب أن يكون النص JSON: كائن أو صفيف أو سلسلة أو رقم أو منطقي. يتم رفض Blob أو ArrayBuffer أو المصفوفة المكتوبة أو FormData أو URLSearchParams أو ReadableStream برمز الخطأ invalid_body قبل إرسال أي طلب.
  • يتم تجاهل رؤوس الإطارات (content-length, transfer-encoding, connection, host, ...).
#
الهوية

3. اقرأ هوية المتصل

يتحقق النظام الأساسي من صحة المفتاح والرمز المميز للمستخدم قبل تشغيل وظيفتك، ثم يضيف هذه الرؤوس:

رأسالقيمة
x-aura-roleanon أو authenticated أو service_role
x-aura-user-idمعرف المستخدم عندما يكون x-aura-role هو authenticated، وإلا فإنه غائب
x-aura-project-idمعرف المشروع
authorizationJWT الخاص بالمستخدم، فقط للمستخدم الذي قام بتسجيل الدخول
apikeyالمفتاح المستخدم للمكالمة
aurabase/functions/whoami/index.tstypescript
Deno.serve((req) => {
  if (req.headers.get('x-aura-role') !== 'authenticated') {
    return new Response('Sign in first', { status: 401 })
  }
  return Response.json({ userId: req.headers.get('x-aura-user-id') })
})

النتائج الحقيقية لهذه المكالمة بثلاثة مفاتيح مختلفة:

results.jsonjson
{ "role": "anon",          "userId": null }
{ "role": "authenticated", "userId": "b125f8cd-ddc8-4042-9d9d-2e0aa3cebe51" }
{ "role": "service_role",  "userId": null }
لا يمكن للمتصل تزييف هذه الرؤوس

تتجاهل المنصة authorization و apikey و x-request-id وكل رأس x-aura-* يضعه المتصل في headers مهما كانت حالتهم. فقط القيم التي تحققت منها هي التي تصل إلى وظيفتك. تمر الرؤوس المخصصة الأخرى دون تغيير.

لا يوجد معرف طلب داخل الوظيفة

لا يتم إعادة توجيه x-request-id للمكالمة إلى وظيفتك. لربط مكالمة بسطر سجل، أنشئ المعرف الخاص بك وأرسله في headers وقم بتسجيله في الوظيفة.

#
HTTP

4. اتصل عبر HTTP

بدون SDK، أرسل كائن JSON الذي يصف الطلب. الحقل body هو ما تتلقاه وظيفتك.

terminalbash
curl -X POST "$AURA_URL/v1/functions/hello/invoke" \
  -H "apikey: $AURA_ANON_KEY" \
  -H "Content-Type: application/json" \
  -d '{"body":{"name":"Ada"}}'

كل من apikey وContent-Type: application/json مطلوبان. أضف Authorization: Bearer <user JWT> للاتصال كمستخدم مسجل الدخول. الاستجابة الافتراضية هي مظروف؛ يعرض الرأس X-Aurabase-Invoke-Mode: raw استجابة وظيفتك الخاصة بدلاً من ذلك، راجع استجابات غير JSON.

#
النتيجة

5. اقرأ النتيجة

invoke لا يرمي أبدًا. تقوم بإرجاع { data, error }:

result.tstypescript
const { data, error } = await aura.functions.invoke('hello', { body: { name: 'Ada' } })

if (error) {
  // error.status: حالة HTTP للفشل
  // error.message: النص الذي أعادته وظيفتك، أو شرح النظام الأساسي
  return
}
// تكون البيانات فارغة عندما لا تُرجع الدالة أي محتوى (على سبيل المثال 204)
if (data === null) return
console.log(data)

اختبر data بدلاً من error عندما تحتاج إلى القيمة: TypeScript ثم تعرف أنها ليست null. للتعامل مع حالات الفشل بدقة، اقرأ الأخطاء والمهلات وإعادة المحاولة .