از برنامه خود با توابع تماس بگیرید

Cloud Functions برای SDK مشتری Firebase به شما امکان می دهد توابع را مستقیماً از یک برنامه Firebase فراخوانی کنید. برای فراخوانی یک تابع از برنامه خود به این روش، یک تابع HTTPS Callable را در Cloud Functions بنویسید و مستقر کنید، و سپس منطق کلاینت را برای فراخوانی تابع از برنامه خود اضافه کنید.

این مهم است که به خاطر داشته باشید که HTTPS توابع قابل فراخوانی توابع مشابه اما به HTTP یکسان نیست. برای استفاده از HTTPS توابع قابل فراخوانی شما باید SDK مشتری برای پلت فرم خود را همراه با استفاده از functions.https API باطن (یا اجرای پروتکل). Calable ها این تفاوت های کلیدی را با توابع HTTP دارند:

  • با قابلیت فراخوانی، توکن‌های Firebase Authentication، نشانه‌های FCM، و نشانه‌های App Check، در صورت وجود، به‌طور خودکار در درخواست‌ها گنجانده می‌شوند.
  • functions.https.onCall ماشه به طور خودکار deserializes بدن درخواست و تایید تایید نشانه.

Firebase SDK for Cloud Functions نسخه 0.9.1 و بالاتر با حداقل نسخه های SDK مشتری Firebase برای پشتیبانی از عملکردهای HTTPS Callable همکاری می کند:

  • Firebase SDK برای پلتفرم های اپل 8.11.0
  • Firebase SDK برای اندروید 20.0.1
  • Firebase JavaScript SDK 8.10.0
  • Firebase Modular Web SDK نسخه 9.0

اگر شما می خواهید برای اضافه کردن قابلیت شبیه به یک برنامه ساخته شده بر روی یک پلت فرم پشتیبانی نشده، دیدن برای مشخصات پروتکل https.onCall . بقیه این راهنما دستورالعمل هایی در مورد نحوه نوشتن، استقرار و فراخوانی یک تابع قابل فراخوانی HTTPS برای پلتفرم های اپل، اندروید، وب، C++ و Unity ارائه می دهد.

تابع فراخوانی را بنویسید و اجرا کنید

استفاده از functions.https.onCall برای ایجاد یک HTTPS قابل فراخوانی تابع. : این متد دو پارامتر طول می کشد data ، و اختیاری context :

// Saves a message to the Firebase Realtime Database but sanitizes the text by removing swearwords.
exports.addMessage = functions.https.onCall((data, context) => {
  // ...
});

برای یک تابع فراخوانی که موجب صرفه جویی یک پیام متنی به پایگاه بیدرنگ، برای مثال، data می تواند شامل متن پیام، در حالی که context پارامترهای نشان دهنده کاربران اطلاعات تایید:

// Message text passed from the client.
const text = data.text;
// Authentication / user information is automatically added to the request.
const uid = context.auth.uid;
const name = context.auth.token.name || null;
const picture = context.auth.token.picture || null;
const email = context.auth.token.email || null;

فاصله بین مکان تابع قابل فراخوانی و مکان کلاینت تماس گیرنده می تواند تأخیر شبکه ایجاد کند. برای بهینه سازی عملکرد، در نظر مشخص کردن محل تابع در آن قابل اجرا، و مطمئن شوید که به چین محل قابل فراخوانی با محل تنظیم زمانی که شما مقداردهی اولیه SDK در سمت سرویس گیرنده.

به صورت اختیاری، می‌توانید گواهی برنامه چک را ضمیمه کنید تا از منابع پشتیبان خود در برابر سوء استفاده محافظت کنید، مانند تقلب در صورت‌حساب یا فیشینگ. مشاهده فعال کردن برنامه بررسی اجرای برای توابع ابر .

بازگرداندن نتیجه

برای ارسال مجدد داده‌ها به مشتری، داده‌هایی را برگردانید که می‌توانند JSON کدگذاری شوند. به عنوان مثال، برای برگرداندن نتیجه یک عملیات جمع:

// returning result.
return {
  firstNumber: firstNumber,
  secondNumber: secondNumber,
  operator: '+',
  operationResult: firstNumber + secondNumber,
};

برای برگرداندن داده ها پس از یک عملیات ناهمزمان، یک وعده را برگردانید. داده های بازگشتی توسط وعده به مشتری بازگردانده می شود. برای مثال، می‌توانید متن پاک‌سازی‌شده‌ای را که تابع قابل فراخوانی نوشته است به پایگاه داده بیدرنگ بازگردانید:

// Saving the new message to the Realtime Database.
const sanitizedMessage = sanitizer.sanitizeText(text); // Sanitize the message.
return admin.database().ref('/messages').push({
  text: sanitizedMessage,
  author: { uid, name, picture, email },
}).then(() => {
  console.log('New Message written');
  // Returning the sanitized message to the client.
  return { text: sanitizedMessage };
})

رسیدگی به خطاها

برای اطمینان از مشتری می شود جزئیات خطا مفید، خطاهای بازگشت از قابل فراخوانی با پرتاب (یا بازگشت یک وعده با رد) یک نمونه از functions.https.HttpsError . خطای یک code ویژگی است که می تواند یکی از مقادیر ذکر شده در functions.https.HttpsError . خطاهای همچنین یک رشته message ، که به طور پیش فرض یک رشته خالی. آنها همچنین می توانند اختیاری دارند details زمینه با مقدار دلخواه. اگر یک دیگر خطای از HttpsError از توابع خود را پرتاب می شود، مشتری خود را به جای یک خطا با پیام دریافت INTERNAL و کد internal .

به عنوان مثال، یک تابع می‌تواند خطاهای اعتبارسنجی و احراز هویت داده‌ها را با پیام‌های خطا ارسال کند تا به کلاینت فراخوان بازگردد:

// Checking attribute.
if (!(typeof text === 'string') || text.length === 0) {
  // Throwing an HttpsError so that the client gets the error details.
  throw new functions.https.HttpsError('invalid-argument', 'The function must be called with ' +
      'one arguments "text" containing the message text to add.');
}
// Checking that the user is authenticated.
if (!context.auth) {
  // Throwing an HttpsError so that the client gets the error details.
  throw new functions.https.HttpsError('failed-precondition', 'The function must be called ' +
      'while authenticated.');
}

تابع فراخوانی را اجرا کنید

بعد از اینکه شما یک تابع فراخوانی ظرف نجات index.js ، آن است که همراه با تمام توابع دیگر زمانی که شما اجرا مستقر firebase deploy . برای اجرای تنها قابل فراخوانی، با استفاده از --only استدلال به عنوان نشان داده شده است به انجام اعزام جزئی :

$ firebase deploy --only functions:addMessage

اگر شما از اشتباهات مجوز زمانی که استقرار توابع روبرو می شوند، مطمئن شوید که مناسب نقش IAM به کاربر در حال اجرا دستورات استقرار اختصاص داده است.

محیط توسعه مشتری خود را تنظیم کنید

مطمئن شوید که پیش نیازها را برآورده می کنید، سپس وابستگی ها و کتابخانه های مشتری مورد نیاز را به برنامه خود اضافه کنید.

iOS+

دستورالعمل ها را به دنبال اضافه فایربیس به برنامه های اپل خود را .

برای نصب و مدیریت وابستگی های Firebase از Swift Package Manager استفاده کنید.

  1. در Xcode متعلق به، با پروژه برنامه خود را باز، حرکت به مسیر File> بسته سویفت> اضافه کردن بسته بندی وابستگی.
  2. هنگامی که از شما خواسته شد، مخزن SDK پلتفرم های Apple Firebase را اضافه کنید:
  3.   https://github.com/firebase/firebase-ios-sdk
      
  4. کتابخانه Cloud Functions را انتخاب کنید.
  5. پس از اتمام، Xcode به طور خودکار شروع به حل و دانلود وابستگی های شما در پس زمینه می کند.

نسخه وب 9

  1. دستورالعمل ها را به دنبال اضافه فایربیس به برنامه وب خود . اطمینان حاصل کنید که برای اجرای فرمان زیر را از ترمینال شما:
    npm install firebase@9.6.3 --save
    
  2. به صورت دستی هم به هسته Firebase و هم توابع Cloud نیاز دارید:

     import { initializeApp } from 'firebase/app';
     import { getFunctions } from 'firebase/functions';
    
     const app = initializeApp({
         projectId: '### CLOUD FUNCTIONS PROJECT ID ###',
         apiKey: '### FIREBASE API KEY ###',
         authDomain: '### FIREBASE AUTH DOMAIN ###',
       });
     const functions = getFunctions(app);
    

نسخه وب 8

  1. دستورالعمل ها را به دنبال اضافه فایربیس به برنامه وب خود .
  2. اضافه کردن هسته فایربیس و ابر کتابخانه توابع مشتری به برنامه خود قرار دهید:
    <script src="https://www.gstatic.com/firebasejs/8.10.0/firebase.js"></script>
    <script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-functions.js"></script>
    

Cloud Functions SDK نیز به صورت بسته npm در دسترس است.

  1. فرمان زیر را اجرا از ترمینال خود را:
    npm install firebase@8.10.0 --save
    
  2. دستی نیاز به هر دو هسته فایربیس و توابع ابر:
    const firebase = require("firebase");
    // Required for side-effects
    require("firebase/functions");
    

جاوا

  1. دستورالعمل ها را به دنبال اضافه فایربیس به برنامه آندروید خود را .

  2. با استفاده از فایربیس آندروید BOM ، اعلام وابستگی برای توابع ابر کتابخانه آندروید در ماژول خود را (در سطح برنامه) فایل Gradle (معمولا app/build.gradle ).

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:29.0.3')
    
        // Declare the dependency for the Cloud Functions library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-functions'
    }
    

    با استفاده از فایربیس آندروید BOM ، برنامه شما همیشه نسخه های سازگار با کتابخانه فایربیس آندروید استفاده خواهد کرد.

    (جایگزین) اعلام فایربیس وابستگی کتابخانه بدون استفاده از BOM

    اگر تصمیم گرفتید از Firebase BoM استفاده نکنید، باید هر نسخه کتابخانه Firebase را در خط وابستگی آن مشخص کنید.

    توجه داشته باشید که در صورت استفاده از کتابخانه فایربیس های متعدد در برنامه شما، ما به شدت توصیه با استفاده از BOM به مدیریت نسخه های کتابخانه، که تضمین می کند که تمام نسخه های سازگار است.

    dependencies {
        // Declare the dependency for the Cloud Functions library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-functions:20.0.1'
    }
    

Kotlin+KTX

  1. دستورالعمل ها را به دنبال اضافه فایربیس به برنامه آندروید خود را .

  2. با استفاده از فایربیس آندروید BOM ، اعلام وابستگی برای توابع ابر کتابخانه آندروید در ماژول خود را (در سطح برنامه) فایل Gradle (معمولا app/build.gradle ).

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:29.0.3')
    
        // Declare the dependency for the Cloud Functions library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-functions-ktx'
    }
    

    با استفاده از فایربیس آندروید BOM ، برنامه شما همیشه نسخه های سازگار با کتابخانه فایربیس آندروید استفاده خواهد کرد.

    (جایگزین) اعلام فایربیس وابستگی کتابخانه بدون استفاده از BOM

    اگر تصمیم گرفتید از Firebase BoM استفاده نکنید، باید هر نسخه کتابخانه Firebase را در خط وابستگی آن مشخص کنید.

    توجه داشته باشید که در صورت استفاده از کتابخانه فایربیس های متعدد در برنامه شما، ما به شدت توصیه با استفاده از BOM به مدیریت نسخه های کتابخانه، که تضمین می کند که تمام نسخه های سازگار است.

    dependencies {
        // Declare the dependency for the Cloud Functions library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-functions-ktx:20.0.1'
    }
    

C++

برای C ++ با آندروید:

  1. دستورالعمل ها را به دنبال اضافه فایربیس به C ++ پروژه خود را .
  2. اضافه کردن firebase_functions کتابخانه برای خود CMakeLists.txt فایل.

برای ++ C با سیستم عامل اپل:

  1. دستورالعمل ها را به دنبال اضافه فایربیس به C ++ پروژه خود را .
  2. اضافه کردن ابر توابع غلاف به خود Podfile :
    pod 'Firebase/Functions'
  3. فایل را ذخیره کنید و سپس اجرا:
    pod install
  4. اضافه کردن هسته فایربیس و ابر توابع چارچوب از فایربیس C ++ SDK به پروژه Xcode متعلق به خود را.
    • firebase.framework
    • firebase_functions.framework

وحدت

  1. دستورالعمل ها را به دنبال اضافه فایربیس به پروژه وحدت خود را .
  2. اضافه کردن FirebaseFunctions.unitypackage از فایربیس وحدت SDK را به پروژه وحدت خود را.

SDK مشتری را راه اندازی کنید

نمونه ای از توابع ابری را راه اندازی کنید:

سریع

lazy var functions = Functions.functions()

هدف-C

@property(strong, nonatomic) FIRFunctions *functions;
// ...
self.functions = [FIRFunctions functions];

نسخه وب 8

firebase.initializeApp({
  apiKey: '### FIREBASE API KEY ###',
  authDomain: '### FIREBASE AUTH DOMAIN ###',
  projectId: '### CLOUD FUNCTIONS PROJECT ID ###'
  databaseURL: 'https://### YOUR DATABASE NAME ###.firebaseio.com',
});

// Initialize Cloud Functions through Firebase
var functions = firebase.functions();

نسخه وب 9

const app = initializeApp({
  projectId: '### CLOUD FUNCTIONS PROJECT ID ###',
  apiKey: '### FIREBASE API KEY ###',
  authDomain: '### FIREBASE AUTH DOMAIN ###',
});
const functions = getFunctions(app);

جاوا

private FirebaseFunctions mFunctions;
// ...
mFunctions = FirebaseFunctions.getInstance();

Kotlin+KTX

private lateinit var functions: FirebaseFunctions
// ...
functions = Firebase.functions

C++

firebase::functions::Functions* functions;
// ...
functions = firebase::functions::Functions::GetInstance(app);

وحدت

functions = Firebase.Functions.DefaultInstance;

تابع را فراخوانی کنید

سریع

functions.httpsCallable("addMessage").call(["text": inputField.text]) { result, error in
  if let error = error as NSError? {
    if error.domain == FunctionsErrorDomain {
      let code = FunctionsErrorCode(rawValue: error.code)
      let message = error.localizedDescription
      let details = error.userInfo[FunctionsErrorDetailsKey]
    }
    // ...
  }
  if let data = result?.data as? [String: Any], let text = data["text"] as? String {
    self.resultField.text = text
  }
}

هدف-C

[[_functions HTTPSCallableWithName:@"addMessage"] callWithObject:@{@"text": _inputField.text}
                                                      completion:^(FIRHTTPSCallableResult * _Nullable result, NSError * _Nullable error) {
  if (error) {
    if (error.domain == FIRFunctionsErrorDomain) {
      FIRFunctionsErrorCode code = error.code;
      NSString *message = error.localizedDescription;
      NSObject *details = error.userInfo[FIRFunctionsErrorDetailsKey];
    }
    // ...
  }
  self->_resultField.text = result.data[@"text"];
}];

نسخه وب 8

var addMessage = firebase.functions().httpsCallable('addMessage');
addMessage({ text: messageText })
  .then((result) => {
    // Read result of the Cloud Function.
    var sanitizedMessage = result.data.text;
  });

نسخه وب 9

import { getFunctions, httpsCallable } from "firebase/functions";

const functions = getFunctions();
const addMessage = httpsCallable(functions, 'addMessage');
addMessage({ text: messageText })
  .then((result) => {
    // Read result of the Cloud Function.
    /** @type {any} */
    const data = result.data;
    const sanitizedMessage = data.text;
  });

جاوا

private Task<String> addMessage(String text) {
    // Create the arguments to the callable function.
    Map<String, Object> data = new HashMap<>();
    data.put("text", text);
    data.put("push", true);

    return mFunctions
            .getHttpsCallable("addMessage")
            .call(data)
            .continueWith(new Continuation<HttpsCallableResult, String>() {
                @Override
                public String then(@NonNull Task<HttpsCallableResult> task) throws Exception {
                    // This continuation runs on either success or failure, but if the task
                    // has failed then getResult() will throw an Exception which will be
                    // propagated down.
                    String result = (String) task.getResult().getData();
                    return result;
                }
            });
}

Kotlin+KTX

private fun addMessage(text: String): Task<String> {
    // Create the arguments to the callable function.
    val data = hashMapOf(
        "text" to text,
        "push" to true
    )

    return functions
            .getHttpsCallable("addMessage")
            .call(data)
            .continueWith { task ->
                // This continuation runs on either success or failure, but if the task
                // has failed then result will throw an Exception which will be
                // propagated down.
                val result = task.result?.data as String
                result
            }
}

C++

firebase::Future<firebase::functions::HttpsCallableResult> AddMessage(
    const std::string& text) {
  // Create the arguments to the callable function.
  firebase::Variant data = firebase::Variant::EmptyMap();
  data.map()["text"] = firebase::Variant(text);
  data.map()["push"] = true;

  // Call the function and add a callback for the result.
  firebase::functions::HttpsCallableReference doSomething =
      functions->GetHttpsCallable("addMessage");
  return doSomething.Call(data);
}

وحدت

private Task<string> addMessage(string text) {
  // Create the arguments to the callable function.
  var data = new Dictionary<string, object>();
  data["text"] = text;
  data["push"] = true;

  // Call the function and extract the operation from the result.
  var function = functions.GetHttpsCallable("addMessage");
  return function.CallAsync(data).ContinueWith((task) => {
    return (string) task.Result.Data;
  });
}

رسیدگی به خطاهای مشتری

در صورتی که سرور خطایی را مرتکب شده باشد یا وعده حاصله رد شده باشد، کلاینت خطایی دریافت می کند.

اگر خطا بازگردانده شده توسط تابع از نوع function.https.HttpsError ، پس از آن مشتری خطا دریافت code ، message ، و details از خطای سرور. در غیر این صورت، خطا شامل پیام INTERNAL و کد INTERNAL . راهنمایی برای چگونه برای دیدن رسیدگی به اشتباهات در عملکرد قابل فراخوانی خود را.

سریع

if let error = error as NSError? {
  if error.domain == FunctionsErrorDomain {
    let code = FunctionsErrorCode(rawValue: error.code)
    let message = error.localizedDescription
    let details = error.userInfo[FunctionsErrorDetailsKey]
  }
  // ...
}

هدف-C

if (error) {
  if (error.domain == FIRFunctionsErrorDomain) {
    FIRFunctionsErrorCode code = error.code;
    NSString *message = error.localizedDescription;
    NSObject *details = error.userInfo[FIRFunctionsErrorDetailsKey];
  }
  // ...
}

نسخه وب 8

var addMessage = firebase.functions().httpsCallable('addMessage');
addMessage({ text: messageText })
  .then((result) => {
    // Read result of the Cloud Function.
    var sanitizedMessage = result.data.text;
  })
  .catch((error) => {
    // Getting the Error details.
    var code = error.code;
    var message = error.message;
    var details = error.details;
    // ...
  });

نسخه وب 9

import { getFunctions, httpsCallable } from "firebase/functions";

const functions = getFunctions();
const addMessage = httpsCallable(functions, 'addMessage');
addMessage({ text: messageText })
  .then((result) => {
    // Read result of the Cloud Function.
    /** @type {any} */
    const data = result.data;
    const sanitizedMessage = data.text;
  })
  .catch((error) => {
    // Getting the Error details.
    const code = error.code;
    const message = error.message;
    const details = error.details;
    // ...
  });

جاوا

addMessage(inputMessage)
        .addOnCompleteListener(new OnCompleteListener<String>() {
            @Override
            public void onComplete(@NonNull Task<String> task) {
                if (!task.isSuccessful()) {
                    Exception e = task.getException();
                    if (e instanceof FirebaseFunctionsException) {
                        FirebaseFunctionsException ffe = (FirebaseFunctionsException) e;
                        FirebaseFunctionsException.Code code = ffe.getCode();
                        Object details = ffe.getDetails();
                    }

                    // ...
                }

                // ...
            }
        });

Kotlin+KTX

addMessage(inputMessage)
        .addOnCompleteListener(OnCompleteListener { task ->
            if (!task.isSuccessful) {
                val e = task.exception
                if (e is FirebaseFunctionsException) {
                    val code = e.code
                    val details = e.details
                }

                // ...
            }

            // ...
        })

C++

void OnAddMessageCallback(
    const firebase::Future<firebase::functions::HttpsCallableResult>& future) {
  if (future.error() != firebase::functions::kErrorNone) {
    // Function error code, will be kErrorInternal if the failure was not
    // handled properly in the function call.
    auto code = static_cast<firebase::functions::Error>(future.error());

    // Display the error in the UI.
    DisplayError(code, future.error_message());
    return;
  }

  const firebase::functions::HttpsCallableResult* result = future.result();
  firebase::Variant data = result->data();
  // This will assert if the result returned from the function wasn't a string.
  std::string message = data.string_value();
  // Display the result in the UI.
  DisplayResult(message);
}

// ...

// ...
  auto future = AddMessage(message);
  future.OnCompletion(OnAddMessageCallback);
  // ...

وحدت

 addMessage(text).ContinueWith((task) => {
  if (task.IsFaulted) {
    foreach (var inner in task.Exception.InnerExceptions) {
      if (inner is FunctionsException) {
        var e = (FunctionsException) inner;
        // Function error code, will be INTERNAL if the failure
        // was not handled properly in the function call.
        var code = e.ErrorCode;
        var message = e.ErrorMessage;
      }
    }
  } else {
    string result = task.Result;
  }
});

قبل از اینکه شما برنامه خود را راه اندازی، شما باید فعال برنامه را بررسی کنید به کمک اطمینان حاصل شود که تنها برنامه های خود را می توانید نقطه پایانی تابع callable خود دسترسی داشته باشید.