Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

ฟังก์ชั่นการโทรจากแอพของคุณ

Cloud Functions for Firebase Client SDK ช่วยให้คุณเรียกใช้ฟังก์ชันต่างๆ ได้โดยตรงจากแอป Firebase ในการเรียกใช้ฟังก์ชันจากแอปของคุณในลักษณะนี้ ให้เขียนและปรับใช้ฟังก์ชัน HTTPS Callable ใน Cloud Functions แล้วเพิ่มตรรกะของไคลเอ็นต์เพื่อเรียกใช้ฟังก์ชันจากแอปของคุณ

สิ่งสำคัญคือต้องจำไว้ว่าฟังก์ชันที่เรียกได้ของ HTTPS จะคล้ายกันแต่ ไม่เหมือนกันกับ ฟังก์ชัน HTTP ในการใช้ฟังก์ชัน HTTPS callable คุณต้องใช้ไคลเอ็นต์ SDK สำหรับแพลตฟอร์มของคุณร่วมกับ functions.https backend API (หรือใช้โปรโตคอล) Callables มีความแตกต่างที่สำคัญเหล่านี้จากฟังก์ชัน HTTP:

  • ด้วย callables, Firebase Authentication tokens, FCM tokens และ App Check tokens จะรวมอยู่ในคำขอโดยอัตโนมัติ
  • ทริกเกอร์ functions.https.onCall จะทำการดีซีเรียลไลซ์เนื้อหาคำขอโดยอัตโนมัติ และตรวจสอบความถูกต้องของโทเค็น

Firebase SDK for Cloud Functions v0.9.1 ขึ้นไปทำงานร่วมกับเวอร์ชันขั้นต่ำของไคลเอ็นต์ Firebase SDK เหล่านี้เพื่อรองรับฟังก์ชัน HTTPS Callable:

  • Firebase SDK สำหรับ iOS 8.1.1
  • Firebase SDK สำหรับ Android 20.0.0
  • Firebase JavaScript SDK 8.6.8
  • Firebase Modular Web SDK เวอร์ชัน 9.0

หากคุณต้องการเพิ่มฟังก์ชันที่คล้ายกันให้กับแอปที่สร้างบนแพลตฟอร์มที่ไม่รองรับ โปรดดูข้อกำหนด โปรโตคอลสำหรับ https.onCall ส่วนที่เหลือของคู่มือนี้จะให้คำแนะนำเกี่ยวกับวิธีการเขียน ปรับใช้ และเรียกใช้ฟังก์ชัน HTTPS callable สำหรับ iOS, Android, เว็บ, C++ และ Unity

เขียนและปรับใช้ฟังก์ชันที่เรียกได้

ใช้ functions.https.onCall เพื่อสร้างฟังก์ชัน HTTPS callable เมธอดนี้ใช้พารามิเตอร์สองตัว: 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;

ระยะห่างระหว่างตำแหน่งของฟังก์ชันที่เรียกได้และตำแหน่งของไคลเอ็นต์ที่เรียกสามารถสร้างเวลาแฝงของเครือข่ายได้ ในการเพิ่มประสิทธิภาพการทำงาน ให้พิจารณาระบุ ตำแหน่งของฟังก์ชันตามความ เหมาะสม และตรวจสอบให้แน่ใจว่าได้จัดตำแหน่งตำแหน่งของ callable กับตำแหน่งที่ตั้งไว้เมื่อคุณ เริ่มต้น SDK ในฝั่งไคลเอ็นต์

หรือคุณสามารถแนบเอกสารรับรอง App Check เพื่อช่วยปกป้องทรัพยากรแบ็กเอนด์ของคุณจากการละเมิด เช่น การฉ้อโกงการเรียกเก็บเงินหรือฟิชชิง โปรดดูที่ เปิดใช้การบังคับใช้การตรวจสอบแอปสำหรับฟังก์ชันระบบคลาวด์

ส่งคืนผลงาน

หากต้องการส่งข้อมูลกลับไปยังไคลเอ็นต์ ให้ส่งคืนข้อมูลที่สามารถเข้ารหัส 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 };
})

จัดการข้อผิดพลาด

เพื่อให้แน่ใจว่าไคลเอนต์ได้รับรายละเอียดข้อผิดพลาดที่เป็นประโยชน์ ให้ส่งคืนข้อผิดพลาดจาก callable โดยส่ง (หรือส่งคืน Promise ที่ถูกปฏิเสธด้วย) อินสแตนซ์ของ 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.');
}

ปรับใช้ฟังก์ชันที่เรียกได้

หลังจากที่คุณบันทึกฟังก์ชัน callable ที่เสร็จสมบูรณ์ภายใน index.js ฟังก์ชันนี้จะถูกปรับใช้พร้อมกับฟังก์ชันอื่นๆ ทั้งหมดเมื่อคุณเรียกใช้ firebase deploy ในการปรับใช้เฉพาะ callable ให้ใช้ --only อาร์กิวเมนต์ดังที่แสดงเพื่อทำการ ปรับใช้บางส่วน :

$ firebase deploy --only functions:addMessage

หากคุณพบข้อผิดพลาดในการอนุญาตเมื่อปรับใช้ฟังก์ชัน ตรวจสอบให้แน่ใจว่าได้กำหนด บทบาท IAM ที่เหมาะสมให้กับผู้ใช้ที่รันคำสั่งการปรับใช้

ตั้งค่าสภาพแวดล้อมการพัฒนาไคลเอ็นต์ของคุณ

ตรวจสอบให้แน่ใจว่าคุณมีคุณสมบัติตรงตามข้อกำหนดเบื้องต้น จากนั้นเพิ่มการพึ่งพาและไลบรารีไคลเอ็นต์ที่จำเป็นลงในแอปของคุณ

iOS

  1. ทำตามคำแนะนำเพื่อ เพิ่ม Firebase ลงในแอป iOS ของคุณ
  2. เพิ่มพ็อด Cloud Functions ลงใน Podfile ของคุณ : 051005bd0
  3. บันทึกไฟล์แล้วเรียกใช้:
    pod install

เว็บ v9

  1. ทำตามคำแนะนำเพื่อ เพิ่ม Firebase ลงในเว็บแอปของ คุณ
  2. เพิ่มไลบรารีไคลเอนต์ Firebase core และ Cloud Functions ในแอปของคุณ:
    <script src="https://www.gstatic.com/firebasejs/8.6.8/firebase.js"></script>
    <script src="https://www.gstatic.com/firebasejs/8.6.8/firebase-functions.js"></script>
    

Cloud Functions SDK ยังมีให้ใช้งานเป็นแพ็คเกจ npm

  1. เรียกใช้คำสั่งต่อไปนี้จากเทอร์มินัลของคุณ:
    npm install firebase@8.6.8 --save
    
  2. ต้องใช้ทั้ง Firebase core และ Cloud Functions ด้วยตนเอง:

    import { initializeApp } from 'firebase/app';
    import { initializeFunctions } from 'firebase/functions';

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

เว็บ v8

  1. ทำตามคำแนะนำเพื่อ เพิ่ม Firebase ลงในเว็บแอปของ คุณ
  2. เพิ่มไลบรารีไคลเอนต์ Firebase core และ Cloud Functions ในแอปของคุณ:
    <script src="https://www.gstatic.com/firebasejs/8.6.8/firebase.js"></script>
    <script src="https://www.gstatic.com/firebasejs/8.6.8/firebase-functions.js"></script>
    

Cloud Functions SDK ยังมีให้ใช้งานเป็นแพ็คเกจ npm

  1. เรียกใช้คำสั่งต่อไปนี้จากเทอร์มินัลของคุณ:
    npm install firebase@8.6.8 --save
    
  2. ต้องใช้ทั้ง Firebase core และ Cloud Functions ด้วยตนเอง:
    const firebase = require("firebase");
    // Required for side-effects
    require("firebase/functions");
    

Java

  1. ทำตามคำแนะนำเพื่อ เพิ่ม Firebase ลงในแอป Android ของคุณ

  2. ใช้ Firebase Android BoM ประกาศการพึ่งพาไลบรารี Cloud Functions Android ใน ไฟล์ Gradle ของ โมดูล (ระดับแอป) (โดยปกติคือ app/build.gradle )

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:28.1.0')
    
        // 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'
    }
    

    เมื่อใช้ Firebase Android BoM แอปของคุณจะใช้ไลบรารี Firebase Android เวอร์ชันที่เข้ากันได้เสมอ

    (ทางเลือก) ประกาศการพึ่งพาไลบรารี Firebase โดยไม่ ใช้ BoM

    หากคุณเลือกที่จะไม่ใช้ Firebase BoM คุณต้องระบุเวอร์ชันไลบรารี Firebase แต่ละเวอร์ชันในบรรทัดการพึ่งพา

    โปรดทราบว่าหากคุณใช้ไลบรารี 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.0'
    }
    

คอตลิน+KTX

  1. ทำตามคำแนะนำเพื่อ เพิ่ม Firebase ลงในแอป Android ของคุณ

  2. ใช้ Firebase Android BoM ประกาศการพึ่งพาไลบรารี Cloud Functions Android ใน ไฟล์ Gradle ของ โมดูล (ระดับแอป) (โดยปกติคือ app/build.gradle )

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:28.1.0')
    
        // 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'
    }
    

    เมื่อใช้ Firebase Android BoM แอปของคุณจะใช้ไลบรารี Firebase Android เวอร์ชันที่เข้ากันได้เสมอ

    (ทางเลือก) ประกาศการพึ่งพาไลบรารี Firebase โดยไม่ ใช้ BoM

    หากคุณเลือกที่จะไม่ใช้ Firebase BoM คุณต้องระบุเวอร์ชันไลบรารี Firebase แต่ละเวอร์ชันในบรรทัดการพึ่งพา

    โปรดทราบว่าหากคุณใช้ไลบรารี 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.0'
    }
    

C++

สำหรับ C++ กับ Android :

  1. ทำตามคำแนะนำเพื่อ เพิ่ม Firebase ในโครงการ C++ ของ คุณ
  2. เพิ่ม firebase_functions ห้องสมุดที่คุณ CMakeLists.txt ไฟล์

สำหรับ C++ กับ iOS :

  1. ทำตามคำแนะนำเพื่อ เพิ่ม Firebase ในโครงการ C++ ของ คุณ
  2. เพิ่มพ็อด Cloud Functions ลงใน Podfile ของคุณ : 051005bd0
  3. บันทึกไฟล์แล้วเรียกใช้:
    pod install
  4. เพิ่มเฟรมเวิร์กหลักของ Firebase และ Cloud Functions จาก Firebase C++ SDK ไปยังโปรเจ็กต์ Xcode
    • firebase.framework
    • firebase_functions.framework

ความสามัคคี

  1. ทำตามคำแนะนำเพื่อ เพิ่ม Firebase ในโครงการ Unity ของคุณ
  2. เพิ่ม FirebaseFunctions.unitypackage จาก Firebase Unity SDK ไปยังโปรเจ็กต์ Unity

เริ่มต้นไคลเอ็นต์ SDK

เริ่มต้นอินสแตนซ์ของ Cloud Functions:

Swift

lazy var functions = Functions.functions()

วัตถุประสงค์-C

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

เว็บ v8

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();

เว็บ v9

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

Java

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

คอตลิน+KTX

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

C++

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

ความสามัคคี

functions = Firebase.Functions.DefaultInstance;

เรียกใช้ฟังก์ชัน

Swift

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"];
}];

เว็บ v8

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

เว็บ v9

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;
  });

Java

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;
                }
            });
}

คอตลิน+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 ดูคำแนะนำสำหรับวิธี จัดการกับข้อผิดพลาด ในฟังก์ชัน callable ของคุณ

Swift

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];
  }
  // ...
}

เว็บ v8

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;
    // ...
  });

เว็บ v9

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;
    // ...
  });

Java

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();
                    }

                    // ...
                }

                // ...
            }
        });

คอตลิน+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;
  }
});

ก่อนที่คุณจะเปิดแอป คุณควรเปิดใช้งาน App Check เพื่อช่วยให้มั่นใจว่ามีเพียงแอปของคุณเท่านั้นที่สามารถเข้าถึงจุดสิ้นสุดของฟังก์ชันที่เรียกได้