إنشاء المشغلات وعمليات الربط

مكتمل

المشغلات هي ما يسبب تشغيل الوظيفة. يُعرف المشغل كيفية استدعاء وظيفة ويجب أن يكون للوظيفة مشغل واحد بالضبط. تتضمن المُشغّلات بيانات مرتبطة بها، والتي غالباً ما تتوفر في صورة الحمولة الخاصة بالدالة.

ربط البيانات بوظيفة هو طريقة من التصريحي ربط مورد آخر إلى الوظيفة; قد تكون متصلة الارتباطات ⁧⁩كارتباطات الإدخال⁧⁩أو ⁧⁩روابط الإخراج⁧⁩أو كليهما. يتم توفير البيانات من الارتباطات للوظيفة في صورة معلمات.

يمكنك خلط ومطابقة روابط بيانات مختلفة لتناسب احتياجاتك. تُعد الروابط أمراً اختيارياً وقد تحتوي الدالة على رابط إدخال/إخراج واحد أو عدة روابط.

تتيح لك المشغلات وروابط البيانات تجنب عملية ضبط وإعداد التشفير الثابت للخدمات الأخرى. تستلم الدالة البيانات (على سبيل المثال، محتوى رسالة قائمة انتظار) في معلمات الدالة. إرسال البيانات (على سبيل المثال، لإنشاء رسالة قائمة انتظار) باستخدام قيمة الإرجاع للوظيفة.

تعريفات المشغل والربط

يتم تعريف المشغلات وروابط البيانات بشكل مختلف اعتمادًا على لغة التطوير.

اللغة يتم تكوين المشغلات وروابط البيانات بواسطة...
C#‎ مكتبة الفئات تزيين الأساليب والمعلمات مع سمات C#‎
Java تزيين الأساليب والمعلمات مع التعليقات التوضيحية Java
JavaScript/PowerShell/Python/TypeScript تحديث مخطط function.json

يوفر المدخل اللغات التي تعتمد على function.json واجهة مستخدم لإضافة روابط في علامة التبويب تكامل. يمكنك أيضا تحرير الملف مباشرة في المدخل في علامة التبويب تعليمة برمجية + اختبار الوظيفة الخاصة بك.

يعرف نوع المعلمة في .NET و Java نوع بيانات الإدخال. على سبيل المثال، استخدم ⁧string⁩ للربط بنص مشغل قائمة الانتظار، وصفيف بايت لقراءته كثنائي، ونوع مخصص لإلغاء التسلسل إلى عنصر. نظرًا إلى أن وظائف مكتبة فئة .NET ووظائف Java لا تعتمد على ⁧⁩وظيفة.js⁧⁩ في التعريفات الملزمة، فلا يمكن إنشاؤها وتحريرها في المدخل. يعتمد تحرير المدخل C# على برنامج نصي C# يستخدم function.js بدلًا من السمات.

بالنسبة للغات التي تكتب ديناميكيا مثل JavaScript، استخدم dataType الخاصية في ملف function.js. على سبيل المثال، لقراءة محتوى طلب HTTP بنموذج ثنائي، استخدم المجموعة⁧dataType⁩إلى⁧binary⁩:

{
    "dataType": "binary",
    "type": "httpTrigger",
    "name": "req",
    "direction": "in"
}

خيارات أخرى لـ ⁧dataType⁩ هي: ⁧stream⁩و⁧string⁩.

اتجاه الربط

لدى كافة المشغلات والروابط خاصية الاتجاه في ملف function.json:

  • بالنسبة للمشغلات، يكون الاتجاه دائما in
  • إضافة روابط الإدخال/الإخراج ⁧in⁩و ⁧out
  • بعض الارتباطات تدعم اتجاهًا خاصًا ⁧inout⁩. إذا كنت تستخدم inout فإن المحرر المتقدم فقط هو المتوفر عبر علامة التبويب دمج في المدخل.

عند استخدام سمات في مكتبة الفئات لتكوين المشغلات والروابط يتم توفير الاتجاه في منشئ سمة أو استدلال من نوع المعلمة.

مشغل Azure Functions ومثال الربط

لنفترض أنك تريد كتابة صف جديد لموقع تخزين Azure Table كلما ظهرت رسالة جديدة في Azure Queue Storage. يمكن تنفيذ هذا السيناريو باستخدام مشغل تخزين Azure Queue وربط إخراج تخزين Azure Table.

إليكم ملفfunction.json لهذا السيناريو.

{
  "bindings": [
    {
      "type": "queueTrigger",
      "direction": "in",
      "name": "order",
      "queueName": "myqueue-items",
      "connection": "MY_STORAGE_ACCT_APP_SETTING"
    },
    {
      "type": "table",
      "direction": "out",
      "name": "$return",
      "tableName": "outTable",
      "connection": "MY_TABLE_STORAGE_ACCT_APP_SETTING"
    }
  ]
}

العنصر الأول في الصفيف bindings هو مشغل تخزين قائمة الانتظار. خصائص type وdirection تحدد المشغّل. تحدد خاصية name معلمة الوظيفة التي تتلقى محتوى رسالة قائمة الانتظار. اسم قائمة الانتظار المراد مراقبتها موجود فيqueueName، وسلسلة الاتصال موجودة في إعداد التطبيق المحدد عن طريق connection.

العنصر الثاني في الصفيفbindingsهو ربط إخراج تخزين جدول Azure. خصائص type وdirection تحدد الربط. تحدد الخاصيةnameكيف توفر الوظيفة صف الجدول الجديد، في هذه الحالة باستخدام قيمة إرجاع الوظيفة. اسم الجدول موجود في tableName، وسلسلة الاتصال موجودة في إعداد التطبيق المحدد بواسطة connection.

مثال البرنامج النصي C#‎

هنا التعليمة البرمجية للبرنامج النصي C# الذي يعمل مع هذا المشغل والربط. لاحظ أن اسم المعلمة التي توفر محتوى رسالة قائمة الانتظار order؛ هذا الاسم مطلوب لأن name قيمة الخاصية في function.json هي order.

#r "Newtonsoft.Json"

using Microsoft.Extensions.Logging;
using Newtonsoft.Json.Linq;

// From an incoming queue message that is a JSON object, add fields and write to Table storage
// The method return value creates a new row in Table Storage
public static Person Run(JObject order, ILogger log)
{
    return new Person() { 
            PartitionKey = "Orders", 
            RowKey = Guid.NewGuid().ToString(),  
            Name = order["Name"].ToString(),
            MobileNumber = order["MobileNumber"].ToString() };  
}

public class Person
{
    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public string Name { get; set; }
    public string MobileNumber { get; set; }
}

مثال JavaScript

يمكن استخدام الملف نفسه function.json مع دالة JavaScript:

// From an incoming queue message that is a JSON object, add fields and write to Table Storage
module.exports = async function (context, order) {
    order.PartitionKey = "Orders";
    order.RowKey = generateRandomId(); 

    context.bindings.order = order;
};

function generateRandomId() {
    return Math.random().toString(36).substring(2, 15) +
        Math.random().toString(36).substring(2, 15);
}

مثال مكتبة الفئات

توفر نفس المعلومات في مكتبة الفئات للمشغل والربط — أسماء قوائم الانتظار والجداول وحسابات التخزين ومعلمات الوظائف للإدخال والإخراج — بواسطة السمات بدلًا من ملف function.json. وفيما يلي مثال على ذلك:

public static class QueueTriggerTableOutput
{
    [FunctionName("QueueTriggerTableOutput")]
    [return: Table("outTable", Connection = "MY_TABLE_STORAGE_ACCT_APP_SETTING")]
    public static Person Run(
        [QueueTrigger("myqueue-items", Connection = "MY_STORAGE_ACCT_APP_SETTING")]JObject order,
        ILogger log)
    {
        return new Person() {
                PartitionKey = "Orders",
                RowKey = Guid.NewGuid().ToString(),
                Name = order["Name"].ToString(),
                MobileNumber = order["MobileNumber"].ToString() };
    }
}

public class Person
{
    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public string Name { get; set; }
    public string MobileNumber { get; set; }
}

الموارد الإضافية

للحصول على أمثلة أكثر تفصيلًا عن المشغلات والروابط يرجى زيارة: