欢迎参加我们将于 2022 年 10 月 18 日举办的 Firebase 峰会(线上线下同时进行),了解 Firebase 如何帮助您加快应用开发速度、满怀信心地发布应用并在之后需要时轻松地扩大应用规模。立即报名

Cơ sở dữ liệu thời gian thực kích hoạt

Trong một vòng đời điển hình, chức năng Cơ sở dữ liệu thời gian thực của Firebase thực hiện những việc sau:

  1. Chờ các thay đổi đối với một đường dẫn Cơ sở dữ liệu thời gian thực cụ thể.
  2. Kích hoạt khi một sự kiện xảy ra và thực hiện các nhiệm vụ của nó.
  3. Nhận một đối tượng dữ liệu có chứa ảnh chụp nhanh của dữ liệu được lưu trữ tại đường dẫn đó.

Bạn có thể kích hoạt một chức năng để phản hồi việc ghi, tạo, cập nhật hoặc xóa các nút cơ sở dữ liệu trong Cơ sở dữ liệu thời gian thực của Firebase.

Kích hoạt một chức năng trên thay đổi Cơ sở dữ liệu thời gian thực của Firebase

Sử dụng gói con firebase-functions/v2/database để tạo một hàm xử lý các sự kiện của Cơ sở dữ liệu thời gian thực Firebase. Để kiểm soát khi nào hàm kích hoạt, hãy chỉ định một trong các trình xử lý sự kiện và chỉ định đường dẫn Cơ sở dữ liệu thời gian thực nơi nó sẽ lắng nghe các sự kiện.

Đặt vị trí chức năng

Khoảng cách giữa vị trí của một cá thể Cơ sở dữ liệu thời gian thực và vị trí của hàm có thể tạo ra độ trễ mạng đáng kể. Ngoài ra, sự không phù hợp giữa các vùng có thể dẫn đến việc triển khai không thành công. Để tránh những trường hợp này, hãy chỉ định vị trí hàm để nó khớp với vị trí phiên bản cơ sở dữ liệu .

Xử lý các sự kiện Cơ sở dữ liệu thời gian thực

Các chức năng cho phép bạn xử lý các sự kiện Cơ sở dữ liệu thời gian thực ở hai cấp độ cụ thể; bạn có thể nghe cụ thể chỉ các sự kiện ghi, tạo, cập nhật hoặc xóa hoặc bạn có thể nghe bất kỳ thay đổi nào dưới bất kỳ hình thức nào đối với tham chiếu.

Các trình xử lý này để phản hồi các sự kiện Cơ sở dữ liệu thời gian thực có sẵn:

  • onValueWritten() Chỉ được kích hoạt khi dữ liệu được ghi trong Cơ sở dữ liệu thời gian thực.
  • onValueCreated() Chỉ được kích hoạt khi dữ liệu được tạo trong Cơ sở dữ liệu thời gian thực.
  • onValueUpdated() Chỉ được kích hoạt khi dữ liệu được cập nhật trong Cơ sở dữ liệu thời gian thực.
  • onValueDeleted() Chỉ được kích hoạt khi dữ liệu bị xóa trong Cơ sở dữ liệu thời gian thực.

Chỉ định phiên bản và đường dẫn

Để kiểm soát thời điểm và vị trí chức năng của bạn sẽ kích hoạt, hãy định cấu hình chức năng của bạn bằng một đường dẫn và tùy chọn là một phiên bản Cơ sở dữ liệu thời gian thực. Nếu bạn không chỉ định một phiên bản, hàm sẽ triển khai cho tất cả các phiên bản Cơ sở dữ liệu thời gian thực trong vùng hàm. Bạn cũng có thể chỉ định một mẫu cá thể Cơ sở dữ liệu thời gian thực để triển khai cho một tập hợp con chọn lọc các cá thể trong cùng một khu vực.

Ví dụ, sử dụng onValueWritten() để minh họa:

# All Realtime Database instances in default function region us-central1 at path "/user/{uid}"
# There must be at least one Realtime Database present in us-central1.
const onwrittenfunctiondefault = onValueWritten("/user/{uid}", (event) => {
  // …
});

# Instance named "my-app-db-2", at path "/user/{uid}".
# The "my-app-db-2" instance must exist in this region.
const onwrittenfunctioninstance = onValueWritten(
  {
    ref: "/user/{uid}",
    instance: "my-app-db-2"
    // This example assumes us-central1, but to set location:
    // region: "europe-west1"
  },
  (event) => {
    // …
  }
);

# Instance with "my-app-db-" prefix, at path "/user/{uid}", where uid ends with @gmail.com.
# There must be at least one Realtime Database with "my-app-db-*" prefix in this region.
const onwrittenfunctioninstance = onValueWritten(
  {
    ref: "/user/{uid=*@gmail.com}",
    instance: "my-app-db-*"
    // This example assumes us-central1, but to set location:
    // region: "europe-west1"
  },
  (event) => {
    // …
  }
);

Các tham số này hướng chức năng của bạn xử lý việc ghi tại một đường dẫn nhất định trong phiên bản Cơ sở dữ liệu thời gian thực.

Thông số kỹ thuật của đường dẫn khớp với tất cả các lần ghi chạm vào một đường dẫn, bao gồm cả các lần ghi xảy ra ở bất kỳ đâu bên dưới đường dẫn đó. Nếu bạn đặt đường dẫn cho hàm của mình là /foo/bar , thì nó sẽ khớp với các sự kiện ở cả hai vị trí sau:

 /foo/bar
 /foo/bar/baz/really/deep/path

Trong cả hai trường hợp, Firebase diễn giải rằng sự kiện xảy ra tại /foo/bar và dữ liệu sự kiện bao gồm dữ liệu cũ và mới tại /foo/bar . Nếu dữ liệu sự kiện có thể lớn, hãy xem xét sử dụng nhiều hàm ở các đường dẫn sâu hơn thay vì một hàm duy nhất gần gốc cơ sở dữ liệu của bạn. Để có hiệu suất tốt nhất, chỉ yêu cầu dữ liệu ở mức sâu nhất có thể.

Ký tự đại diện và bắt giữ

Bạn có thể sử dụng {key} , {key=*} , {key=prefix*} , {key=*suffix} để chụp. Hậu tố * , prefix* , *suffix cho ký tự đại diện một đoạn. Lưu ý: ** đại diện cho ký tự đại diện nhiều phân đoạn, mà RTDB không hỗ trợ. Xem phần Hiểu các mẫu đường dẫn .

Đường dẫn hoang dã. Bạn có thể chỉ định một thành phần đường dẫn dưới dạng ký tự đại diện:

  • Sử dụng dấu hoa thị, * . Ví dụ: foo/* khớp với bất kỳ con nào ở một cấp của hệ thống phân cấp nút bên dưới foo/ .
  • Sử dụng một phân đoạn có chứa chính xác dấu hoa thị, * . Ví dụ: foo/app*-us khớp với bất kỳ phân đoạn con nào bên dưới foo/ với tiền tố app và hậu tố -us .

Các đường dẫn có ký tự đại diện có thể khớp với nhiều sự kiện, chẳng hạn từ một lần ghi. Một phụ trang của

{
  "foo": {
    "hello": "world",
    "firebase": "functions"
  }
}

khớp với đường dẫn "/foo/*" hai lần: một lần với "hello": "world" và một lần nữa với "firebase": "functions" .

Chụp đường dẫn. Bạn có thể nắm bắt các đối sánh đường dẫn thành các biến đã đặt tên để sử dụng trong mã hàm của mình (ví dụ: /user/{uid} , /user/{uid=*-us} ).

Các giá trị của các biến bắt có sẵn trong đối tượng database.DatabaseEvent.params của hàm của bạn.

Ký tự đại diện phiên bản. Bạn cũng có thể chỉ định một thành phần cá thể bằng cách sử dụng ký tự đại diện. Một ký tự đại diện mẫu có thể có tiền tố, hậu tố hoặc cả hai (ví dụ: my-app-*-prod ).

Tham chiếu ký tự đại diện và chụp

Với Chức năng đám mây v2 và Cơ sở dữ liệu thời gian thực, một mẫu có thể được sử dụng khi chỉ định refinstance . Mỗi giao diện trình kích hoạt sẽ có các tùy chọn sau để xác định phạm vi một chức năng:

Chỉ định ref Chỉ định instance bản Hành vi
Đơn ( /foo/bar ) Không xác định Trình xử lý phạm vi cho tất cả các phiên bản trong vùng chức năng.
Đơn ( /foo/bar ) Đơn ( 'my-new-db' ) Trình xử lý phạm vi cho cá thể cụ thể trong vùng chức năng.
Đơn ( /foo/bar ) Mẫu ( 'inst-prefix*' ) Trình xử lý phạm vi cho tất cả các trường hợp khớp với mẫu trong vùng chức năng.
Mẫu ( /foo/{bar} ) Không xác định Trình xử lý phạm vi cho tất cả các phiên bản trong vùng chức năng.
Mẫu ( /foo/{bar} ) Đơn ( 'my-new-db' ) Trình xử lý phạm vi cho cá thể cụ thể trong vùng chức năng.
Mẫu ( /foo/{bar} ) Mẫu ( 'inst-prefix*' ) Trình xử lý phạm vi cho tất cả các trường hợp khớp với mẫu trong vùng chức năng.

Xử lý dữ liệu sự kiện

Khi xử lý một sự kiện Cơ sở dữ liệu thời gian thực, đối tượng dữ liệu được trả về là một DataSnapshot dữ liệu.

Đối với các sự kiện onValueWritten hoặc onValueUpdated , tham số đầu tiên là một đối tượng Change có chứa hai ảnh chụp nhanh đại diện cho trạng thái dữ liệu trước và sau sự kiện kích hoạt.

Đối với các sự kiện onValueCreatedonValueDeleted , đối tượng dữ liệu được trả về là ảnh chụp nhanh của dữ liệu được tạo hoặc xóa.

Trong ví dụ này, hàm truy xuất ảnh chụp nhanh cho đường dẫn được chỉ định foo/bar dưới dạng snap , chuyển đổi chuỗi tại vị trí đó thành chữ hoa và ghi chuỗi đã sửa đổi đó vào cơ sở dữ liệu:

// Listens for new messages added to /messages/:pushId/original and creates an
// uppercase version of the message to /messages/:pushId/uppercase
export makeuppercase = onValueCreated("foo/bar", (event) => {
      // Grab the current value of what was written to the Realtime Database.
      const original = event.data.val();
      functions.logger.log('Uppercasing', event.params.pushId, original);
      const uppercase = original.toUpperCase();
      // You must return a Promise when performing asynchronous tasks inside a Functions such as
      // writing to the Firebase Realtime Database.
      // Setting an "uppercase" sibling in the Realtime Database returns a Promise.
      return event.data.ref.parent.child('uppercase').set(uppercase);
    });

Đọc giá trị trước đó

Đối tượng Change có thuộc tính before cho phép bạn kiểm tra những gì đã được lưu vào Cơ sở dữ liệu thời gian thực trước sự kiện. Thuộc tính before trả về một DataSnapshot trong đó tất cả các phương thức (ví dụ: val()exists() ) tham chiếu đến giá trị trước đó. Bạn có thể đọc lại giá trị mới bằng cách sử dụng DataSnapshot ban đầu hoặc đọc thuộc tính after . Thuộc tính này trên bất kỳ Change nào là một DataSnapshot dữ liệu khác đại diện cho trạng thái của dữ liệu sau khi sự kiện xảy ra.

Ví dụ: thuộc tính before có thể được sử dụng để đảm bảo hàm chỉ viết hoa văn bản khi nó được tạo lần đầu tiên:

    exports makeuppercase = onValueWritten("/messages/{pushId}/original", (event) => {
          // Only edit data when it is first created.
          if (event.data.before.exists()) {
            return null;
          }
          // Exit when the data is deleted.
          if (!event.data.after.exists()) {
            return null;
          }
          // Grab the current value of what was written to the Realtime Database.
          const original = event.data.after.val();
          console.log('Uppercasing', event.params.pushId, original);
          const uppercase = original.toUpperCase();
          // You must return a Promise when performing asynchronous tasks inside a Functions such as
          // writing to the Firebase Realtime Database.
          // Setting an "uppercase" sibling in the Realtime Database returns a Promise.
          return event.data.after.ref.parent.child('uppercase').set(uppercase);
        });