ขยาย Cloud Firestore ด้วย Cloud Functions (รุ่นที่ 2)

Cloud Functions ช่วยให้คุณทําให้โค้ดใช้งานได้เพื่อจัดการเหตุการณ์ที่เรียกให้แสดงโดยการเปลี่ยนแปลงในฐานข้อมูล Cloud Firestore ซึ่งช่วยให้คุณเพิ่มฟังก์ชันฝั่งเซิร์ฟเวอร์ลงในแอปได้อย่างง่ายดายโดยไม่ต้องใช้เซิร์ฟเวอร์ของคุณเอง

Cloud Functions (รุ่นที่ 2)

Cloud Functions for Firebase (รุ่นที่ 2) ขับเคลื่อนโดย Cloud Run และ Eventarc มอบโครงสร้างพื้นฐานที่มีประสิทธิภาพมากขึ้น การควบคุมขั้นสูงด้านประสิทธิภาพและความสามารถในการปรับขนาด รวมถึงการควบคุมรันไทม์ของฟังก์ชันได้มากขึ้น ดูข้อมูลเพิ่มเติมเกี่ยวกับรุ่นที่ 2 ได้ที่ Cloud Functions for Firebase (รุ่นที่ 2) หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับรุ่นที่ 1 แทน โปรดดูหัวข้อขยายความสามารถของ Cloud Firestore ด้วย Cloud Functions

ทริกเกอร์ฟังก์ชัน Cloud Firestore

Cloud Functions for Firebase SDK จะส่งออกCloud Firestoreทริกเกอร์เหตุการณ์ต่อไปนี้เพื่อให้คุณสร้างตัวแฮนเดิลที่เชื่อมโยงกับCloud Firestoreเหตุการณ์ที่เฉพาะเจาะจงได้

Node.js

ประเภทเหตุการณ์ ทริกเกอร์
onDocumentCreated ทริกเกอร์เมื่อมีการเขียนเอกสารเป็นครั้งแรก
onDocumentUpdated ทริกเกอร์เมื่อเอกสารมีอยู่แล้วและมีการเปลี่ยนแปลงค่า
onDocumentDeleted ทริกเกอร์เมื่อมีการลบเอกสาร
onDocumentWritten ทริกเกอร์เมื่อมีการเรียกใช้ onDocumentCreated, onDocumentUpdated หรือ onDocumentDeleted
onDocumentCreatedWithAuthContext onDocumentCreated พร้อมข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม
onDocumentWrittenWithAuthContext onDocumentWritten พร้อมข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม
onDocumentDeletedWithAuthContext onDocumentDeleted พร้อมข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม
onDocumentUpdatedWithAuthContext onDocumentUpdated พร้อมข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม

Python (เวอร์ชันตัวอย่าง)

ประเภทเหตุการณ์ ทริกเกอร์
on_document_created ทริกเกอร์เมื่อมีการเขียนเอกสารเป็นครั้งแรก
on_document_updated ทริกเกอร์เมื่อเอกสารมีอยู่แล้วและมีการเปลี่ยนแปลงค่า
on_document_deleted ทริกเกอร์เมื่อมีการลบเอกสาร
on_document_written ทริกเกอร์เมื่อมีการเรียกใช้ on_document_created, on_document_updated หรือ on_document_deleted
on_document_created_with_auth_context on_document_created พร้อมข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม
on_document_updated_with_auth_context on_document_updated พร้อมข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม
on_document_deleted_with_auth_context on_document_deleted พร้อมข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม
on_document_written_with_auth_context on_document_written พร้อมข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม

เหตุการณ์ Cloud Firestore จะทริกเกอร์เมื่อเอกสารมีการเปลี่ยนแปลงเท่านั้น การอัปเดตเอกสาร Cloud Firestore ที่ไม่มีการเปลี่ยนแปลงข้อมูล (การเขียนแบบไม่ดำเนินการ) จะไม่สร้างเหตุการณ์การอัปเดตหรือการเขียน คุณจะเพิ่มเหตุการณ์ลงในบางฟิลด์ไม่ได้

หากยังไม่ได้เปิดใช้โปรเจ็กต์สำหรับ Cloud Functions for Firebase โปรดอ่านหัวข้อเริ่มต้นใช้งาน Cloud Functions for Firebase (รุ่นที่ 2) เพื่อกำหนดค่าและตั้งค่าโปรเจ็กต์ Cloud Functions for Firebase

กำลังเขียนฟังก์ชันที่ทริกเกอร์ Cloud Firestore รายการ

กําหนดทริกเกอร์ฟังก์ชัน

หากต้องการกำหนดทริกเกอร์ Cloud Firestore ให้ระบุเส้นทางของเอกสารและประเภทเหตุการณ์ ดังนี้

Node.js

import {
  onDocumentWritten,
  onDocumentCreated,
  onDocumentUpdated,
  onDocumentDeleted,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.myfunction = onDocumentWritten("my-collection/{docId}", (event) => {
   /* ... */ 
});

Python (ตัวอย่าง)

from firebase_functions.firestore_fn import (
  on_document_created,
  on_document_deleted,
  on_document_updated,
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_created(document="users/{userId}")
def myfunction(event: Event[DocumentSnapshot]) -> None:

เส้นทางเอกสารจะอ้างอิงเอกสารที่เฉพาะเจาะจงหรือรูปแบบไวลด์การ์ดก็ได้

ระบุเอกสารรายการเดียว

หากต้องการทริกเกอร์เหตุการณ์สําหรับการเปลี่ยนแปลงใดๆ ในเอกสารที่เฉพาะเจาะจง ให้ใช้ฟังก์ชันต่อไปนี้

Node.js

import {
  onDocumentWritten,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.myfunction = onDocumentWritten("users/marie", (event) => {
  // Your code here
});

Python (เวอร์ชันตัวอย่าง)

from firebase_functions.firestore_fn import (
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_written(document="users/marie")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:

ระบุกลุ่มเอกสารโดยใช้ไวลด์การ์ด

หากคุณต้องการแนบทริกเกอร์กับกลุ่มเอกสาร เช่น เอกสารในคอลเล็กชันหนึ่ง ให้ใช้ {wildcard} แทนรหัสเอกสาร ดังนี้

Node.js

import {
  onDocumentWritten,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.myfunction = onDocumentWritten("users/{userId}", (event) => {
  // If we set `/users/marie` to {name: "Marie"} then
  // event.params.userId == "marie"
  // ... and ...
  // event.data.after.data() == {name: "Marie"}
});

Python (ตัวอย่าง)

from firebase_functions.firestore_fn import (
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_written(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # If we set `/users/marie` to {name: "Marie"} then
  event.params["userId"] == "marie"  # True
  # ... and ...
  event.data.after.to_dict() == {"name": "Marie"}  # True

ในตัวอย่างนี้ เมื่อฟิลด์ใดก็ตามในเอกสารใดก็ตามใน users มีการเปลี่ยนแปลง ระบบจะจับคู่กับไวลด์การ์ดชื่อ userId

หากเอกสารใน users มีคอลเล็กชันย่อยและมีการเปลี่ยนแปลงช่องในเอกสารของคอลเล็กชันย่อยรายการใดรายการหนึ่ง ระบบจะไม่เรียกใช้ไวลด์การ์ด userId

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

Node.js

import {
  onDocumentWritten,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.myfunction = onDocumentWritten("users/{userId}/{messageCollectionId}/{messageId}", (event) => {
    // If we set `/users/marie/incoming_messages/134` to {body: "Hello"} then
    // event.params.userId == "marie";
    // event.params.messageCollectionId == "incoming_messages";
    // event.params.messageId == "134";
    // ... and ...
    // event.data.after.data() == {body: "Hello"}
});

Python (ตัวอย่าง)

from firebase_functions.firestore_fn import (
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_written(document="users/{userId}/{messageCollectionId}/{messageId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # If we set `/users/marie/incoming_messages/134` to {body: "Hello"} then
  event.params["userId"] == "marie"  # True
  event.params["messageCollectionId"] == "incoming_messages"  # True
  event.params["messageId"] == "134"  # True
  # ... and ...
  event.data.after.to_dict() == {"body": "Hello"}

ทริกเกอร์ต้องชี้ไปยังเอกสารเสมอ แม้ว่าคุณจะใช้ไวลด์การ์ดก็ตาม ตัวอย่างเช่น users/{userId}/{messageCollectionId} ไม่ถูกต้องเนื่องจาก {messageCollectionId} เป็นคอลเล็กชัน แต่ users/{userId}/{messageCollectionId}/{messageId} ถูกต้องเนื่องจาก {messageId} จะชี้ไปยังเอกสารเสมอ

ทริกเกอร์เหตุการณ์

ทริกเกอร์ฟังก์ชันเมื่อสร้างเอกสารใหม่

คุณสามารถเรียกให้ฟังก์ชันเริ่มทำงานทุกครั้งที่มีการสร้างเอกสารใหม่ในคอลเล็กชัน ฟังก์ชันตัวอย่างนี้จะทริกเกอร์ทุกครั้งที่มีการเพิ่มโปรไฟล์ผู้ใช้ใหม่

Node.js

import {
  onDocumentCreated,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.createuser = onDocumentCreated("users/{userId}", (event) => {
    // Get an object representing the document
    // e.g. {'name': 'Marie', 'age': 66}
    const snapshot = event.data;
    if (!snapshot) {
        console.log("No data associated with the event");
        return;
    }
    const data = snapshot.data();

    // access a particular field as you would any JS property
    const name = data.name;

    // perform more operations ...
});

หากต้องการข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม ให้ใช้ onDocumentCreatedWithAuthContext

Python (เวอร์ชันตัวอย่าง)

from firebase_functions.firestore_fn import (
  on_document_created,
  Event,
  DocumentSnapshot,
)

@on_document_created(document="users/{userId}")
def myfunction(event: Event[DocumentSnapshot]) -> None:
  # Get a dictionary representing the document
  # e.g. {'name': 'Marie', 'age': 66}
  new_value = event.data.to_dict()

  # Access a particular field as you would any dictionary
  name = new_value["name"]

  # Perform more operations ...

ทริกเกอร์ฟังก์ชันเมื่อมีการอัปเดตเอกสาร

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

Node.js

import {
  onDocumentUpdated,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.updateuser = onDocumentUpdated("users/{userId}", (event) => {
    // Get an object representing the document
    // e.g. {'name': 'Marie', 'age': 66}
    const newValue = event.data.after.data();

    // access a particular field as you would any JS property
    const name = newValue.name;

    // perform more operations ...
});

สำหรับข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม โปรดใช้ onDocumentUpdatedWithAuthContext

Python (เวอร์ชันตัวอย่าง)

from firebase_functions.firestore_fn import (
  on_document_updated,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_updated(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # Get a dictionary representing the document
  # e.g. {'name': 'Marie', 'age': 66}
  new_value = event.data.after.to_dict()

  # Access a particular field as you would any dictionary
  name = new_value["name"]

  # Perform more operations ...

ทริกเกอร์ฟังก์ชันเมื่อมีการลบเอกสาร

นอกจากนี้ คุณยังเรียกใช้ฟังก์ชันเมื่อมีการลบเอกสารได้ด้วย ตัวอย่างฟังก์ชันนี้จะทํางานเมื่อผู้ใช้ลบโปรไฟล์ผู้ใช้

Node.js

import {
  onDocumentDeleted,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.deleteuser = onDocumentDeleted("users/{userId}", (event) => {
    // Get an object representing the document
    // e.g. {'name': 'Marie', 'age': 66}
    const snap =  event.data;
    const data =  snap.data();

    // perform more operations ...
});

หากต้องการข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม ให้ใช้ onDocumentDeletedWithAuthContext

Python (เวอร์ชันตัวอย่าง)

from firebase_functions.firestore_fn import (
  on_document_deleted,
  Event,
  DocumentSnapshot,
)

@on_document_deleted(document="users/{userId}")
def myfunction(event: Event[DocumentSnapshot|None]) -> None:
  # Perform more operations ...

ทริกเกอร์ฟังก์ชันสําหรับการเปลี่ยนแปลงทั้งหมดในเอกสาร

หากไม่สนใจประเภทของเหตุการณ์ที่เริ่มทํางาน คุณสามารถรอฟังการเปลี่ยนแปลงทั้งหมดในเอกสาร Cloud Firestore โดยใช้ทริกเกอร์เหตุการณ์ "เขียนเอกสาร" ฟังก์ชันตัวอย่างนี้จะทํางานหากมีการสร้าง อัปเดต หรือลบผู้ใช้

Node.js

import {
  onDocumentWritten,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.modifyuser = onDocumentWritten("users/{userId}", (event) => {
    // Get an object with the current document values.
    // If the document does not exist, it was deleted
    const document =  event.data.after.data();

    // Get an object with the previous document values
    const previousValues =  event.data.before.data();

    // perform more operations ...
});

หากต้องการข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม ให้ใช้ onDocumentWrittenWithAuthContext

Python (เวอร์ชันตัวอย่าง)

from firebase_functions.firestore_fn import (
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_written(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot | None]]) -> None:
  # Get an object with the current document values.
  # If the document does not exist, it was deleted.
  document = (event.data.after.to_dict()
              if event.data.after is not None else None)

  # Get an object with the previous document values.
  # If the document does not exist, it was newly created.
  previous_values = (event.data.before.to_dict()
                     if event.data.before is not None else None)

  # Perform more operations ...

การอ่านและเขียนข้อมูล

เมื่อทริกเกอร์ฟังก์ชัน ระบบจะแสดงภาพรวมของข้อมูลที่เกี่ยวข้องกับเหตุการณ์ คุณสามารถใช้ภาพรวมนี้เพื่ออ่านหรือเขียนลงในเอกสารที่ทริกเกอร์เหตุการณ์ หรือใช้ Firebase Admin SDK เพื่อเข้าถึงส่วนอื่นๆ ของฐานข้อมูล

ข้อมูลเหตุการณ์

การอ่านข้อมูล

เมื่อทริกเกอร์ฟังก์ชัน คุณอาจต้องการรับข้อมูลจากเอกสารที่อัปเดตแล้ว หรือรับข้อมูลก่อนการอัปเดต คุณดูข้อมูลก่อนหน้าได้โดยใช้ event.data.before ซึ่งมีสแนปชอตเอกสารก่อนการอัปเดต ในทำนองเดียวกัน event.data.after จะมีสถานะสแนปชอตเอกสารหลังจากการอัปเดต

Node.js

exports.updateuser2 = onDocumentUpdated("users/{userId}", (event) => {
    // Get an object with the current document values.
    // If the document does not exist, it was deleted
    const newValues =  event.data.after.data();

    // Get an object with the previous document values
    const previousValues =  event.data.before.data();
});

Python (เวอร์ชันตัวอย่าง)

@on_document_updated(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # Get an object with the current document values.
  new_value = event.data.after.to_dict()

  # Get an object with the previous document values.
  prev_value = event.data.before.to_dict()

คุณสามารถเข้าถึงพร็อพเพอร์ตี้ได้เช่นเดียวกับในออบเจ็กต์อื่นๆ หรือจะใช้ฟังก์ชัน get เพื่อเข้าถึงช่องข้อมูลที่ต้องการ ดังนี้

Node.js

// Fetch data using standard accessors
const age = event.data.after.data().age;
const name = event.data.after.data()['name'];

// Fetch data using built in accessor
const experience = event.data.after.data.get('experience');

Python (เวอร์ชันตัวอย่าง)

# Get the value of a single document field.
age = event.data.after.get("age")

# Convert the document to a dictionary.
age = event.data.after.to_dict()["age"]

การเขียนข้อมูล

การเรียกใช้ฟังก์ชันแต่ละรายการจะเชื่อมโยงกับเอกสารที่เฉพาะเจาะจงในฐานข้อมูล Cloud Firestore คุณสามารถเข้าถึงเอกสารดังกล่าวในสแนปชอตที่แสดงผลในฟังก์ชัน

การอ้างอิงเอกสารจะมีเมธอดต่างๆ เช่น update(), set() และ remove() เพื่อให้คุณแก้ไขเอกสารที่ทริกเกอร์ฟังก์ชันได้

Node.js

import { onDocumentUpdated } from "firebase-functions/v2/firestore";

exports.countnamechanges = onDocumentUpdated('users/{userId}', (event) => {
  // Retrieve the current and previous value
  const data = event.data.after.data();
  const previousData = event.data.before.data();

  // We'll only update if the name has changed.
  // This is crucial to prevent infinite loops.
  if (data.name == previousData.name) {
    return null;
  }

  // Retrieve the current count of name changes
  let count = data.name_change_count;
  if (!count) {
    count = 0;
  }

  // Then return a promise of a set operation to update the count
  return data.after.ref.set({
    name_change_count: count + 1
  }, {merge: true});

});

Python (เวอร์ชันตัวอย่าง)

@on_document_updated(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # Get the current and previous document values.
  new_value = event.data.after
  prev_value = event.data.before

  # We'll only update if the name has changed.
  # This is crucial to prevent infinite loops.
  if new_value.get("name") == prev_value.get("name"):
      return

  # Retrieve the current count of name changes
  count = new_value.to_dict().get("name_change_count", 0)

  # Update the count
  new_value.reference.update({"name_change_count": count + 1})

เข้าถึงข้อมูลการตรวจสอบสิทธิ์ของผู้ใช้

หากใช้เหตุการณ์ประเภทใดประเภทหนึ่งต่อไปนี้ คุณจะเข้าถึงข้อมูลการตรวจสอบสิทธิ์ผู้ใช้เกี่ยวกับรายการหลักที่ทริกเกอร์เหตุการณ์ได้ ข้อมูลนี้นอกเหนือจากข้อมูลที่แสดงในเหตุการณ์พื้นฐาน

Node.js

  • onDocumentCreatedWithAuthContext
  • onDocumentWrittenWithAuthContext
  • onDocumentDeletedWithAuthContext
  • onDocumentUpdatedWithAuthContext

Python (เวอร์ชันตัวอย่าง)

  • on_document_created_with_auth_context
  • on_document_updated_with_auth_context
  • on_document_deleted_with_auth_context
  • on_document_written_with_auth_context

ดูข้อมูลเกี่ยวกับข้อมูลที่มีอยู่ในบริบทการตรวจสอบสิทธิ์ได้ที่หัวข้อบริบทการตรวจสอบสิทธิ์ ตัวอย่างต่อไปนี้แสดงวิธีเรียกข้อมูลการตรวจสอบสิทธิ์

Node.js

import { onDocumentWrittenWithAuthContext } from "firebase-functions/v2/firestore"

exports.syncUser = onDocumentWrittenWithAuthContext("users/{userId}", (event) => {
    const snapshot = event.data.after;
    if (!snapshot) {
        console.log("No data associated with the event");
        return;
    }
    const data = snapshot.data();

    // retrieve auth context from event
    const { authType, authId } = event;

    let verified = false;
    if (authType === "system") {
      // system-generated users are automatically verified
      verified = true;
    } else if (authType === "unknown" || authType === "unauthenticated") {
      // admin users from a specific domain are verified
      if (authId.endsWith("@example.com")) {
        verified = true;
      }
    }

    return data.after.ref.set({
        created_by: authId,
        verified,
    }, {merge: true}); 
}); 

Python (เวอร์ชันตัวอย่าง)

@on_document_updated_with_auth_context(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:

  # Get the current and previous document values.
  new_value = event.data.after
  prev_value = event.data.before

  # Get the auth context from the event
  user_auth_type = event.auth_type
  user_auth_id = event.auth_id

ข้อมูลนอกเหตุการณ์ทริกเกอร์

Cloud Functions ทำงานในสภาพแวดล้อมที่เชื่อถือได้ ซึ่งได้รับสิทธิ์ให้เป็นบัญชีบริการในโปรเจ็กต์ของคุณ และคุณทำการอ่านและเขียนได้โดยใช้ Firebase Admin SDK โดยมีรายละเอียดดังนี้

Node.js

const { initializeApp } = require('firebase-admin/app');
const { getFirestore, Timestamp, FieldValue } = require('firebase-admin/firestore');

initializeApp();
const db = getFirestore();

exports.writetofirestore = onDocumentWritten("some/doc", (event) => {
    db.doc('some/otherdoc').set({ ... });
  });

  exports.writetofirestore = onDocumentWritten('users/{userId}', (event) => {
    db.doc('some/otherdoc').set({
      // Update otherdoc
    });
  });

Python (เวอร์ชันตัวอย่าง)

from firebase_admin import firestore, initialize_app
import google.cloud.firestore

initialize_app()

@on_document_written(document="some/doc")
def myfunction(event: Event[Change[DocumentSnapshot | None]]) -> None:
  firestore_client: google.cloud.firestore.Client = firestore.client()
  firestore_client.document("another/doc").set({
      # ...
  })

ข้อจำกัด

โปรดทราบว่าทริกเกอร์ Cloud Firestore สำหรับ Cloud Functions มีข้อจำกัดต่อไปนี้

  • Cloud Functions (รุ่นที่ 1) ต้องมีฐานข้อมูล "(ค่าเริ่มต้น)" ที่มีอยู่ในโหมดดั้งเดิมของ Firestore แต่ไม่รองรับCloud Firestoreฐานข้อมูลที่ชื่อหรือโหมด Datastore โปรดใช้ Cloud Functions (รุ่นที่ 2) เพื่อกําหนดค่าเหตุการณ์ในกรณีดังกล่าว
  • เราไม่รับประกันว่าจะสั่งซื้อ การเปลี่ยนแปลงอย่างรวดเร็วอาจทริกเกอร์การเรียกใช้ฟังก์ชันในลําดับที่ไม่คาดคิด
  • ระบบนำส่งเหตุการณ์อย่างน้อย 1 ครั้ง แต่เหตุการณ์เดียวอาจทำให้เกิดการเรียกใช้ฟังก์ชันหลายรายการ หลีกเลี่ยงการพึ่งพากลไก "ดำเนินการเพียงครั้งเดียว" และเขียนฟังก์ชันที่ทำงานแบบ idempotent
  • Cloud Firestore ในโหมด Datastoreต้องใช้ Cloud Functions (รุ่นที่ 2) Cloud Functions (รุ่นที่ 1) ไม่รองรับโหมด Datastore
  • ทริกเกอร์จะเชื่อมโยงกับฐานข้อมูลเดียว คุณสร้างทริกเกอร์ที่ตรงกับฐานข้อมูลหลายรายการไม่ได้
  • การลบฐานข้อมูลจะไม่ลบทริกเกอร์ของฐานข้อมูลนั้นโดยอัตโนมัติ ทริกเกอร์จะหยุดส่งเหตุการณ์ แต่จะยังคงอยู่จนกว่าคุณจะลบทริกเกอร์
  • หากเหตุการณ์ที่ตรงกันมีขนาดใหญ่เกินขนาดคำขอสูงสุด ระบบอาจไม่ส่งเหตุการณ์ไปยัง Cloud Functions (รุ่นที่ 1)
    • ระบบจะบันทึกเหตุการณ์ที่ไม่ได้แสดงเนื่องจากขนาดคำขอไว้ในบันทึกของแพลตฟอร์ม และนับรวมไว้ในการใช้งานบันทึกของโปรเจ็กต์
    • คุณดูบันทึกเหล่านี้ได้ในเครื่องมือสำรวจบันทึกที่มีข้อความ "ส่งเหตุการณ์ไปยังฟังก์ชัน Cloud ไม่ได้เนื่องจากมีขนาดใหญ่เกินขีดจํากัดของรุ่นที่ 1..." ความรุนแรงระดับ error คุณจะเห็นชื่อฟังก์ชันใต้ช่อง functionName หากช่อง receiveTimestamp ยังอยู่ภายใน 1 ชั่วโมงนับจากนี้ คุณสามารถอนุมานเนื้อหาเหตุการณ์จริงได้โดยอ่านเอกสารที่เป็นปัญหาพร้อมภาพหน้าจอก่อนและหลังการประทับเวลา
    • คุณหลีกเลี่ยงจังหวะดังกล่าวได้โดยทำดังนี้
      • ย้ายข้อมูลและอัปเกรดเป็น Cloud Functions (รุ่นที่ 2)
      • ลดขนาดเอกสาร
      • ลบ Cloud Functions ที่เป็นปัญหา
    • คุณสามารถปิดการบันทึกนั้นเองโดยใช้การยกเว้น แต่โปรดทราบว่าระบบจะไม่ส่งเหตุการณ์ที่ไม่เหมาะสม