Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.
Trang này được dịch bởi Cloud Translation API.
Switch to English

Hướng dẫn nâng cấp SDK Firebase cho Chức năng đám mây: beta lên phiên bản 1.0 trở lên

Phiên bản 1.0.0 của SDK Firebase cho Chức năng đám mây đã giới thiệu một số thay đổi quan trọng trong API. Thay đổi chính, thay thế định dạng event.data bằng data và tham số context , ảnh hưởng đến tất cả các chức năng không đồng bộ (không phải HTTP). SDK cập nhật cũng có thể được sử dụng với firebase-functions-test , một SDK đồng hành thử nghiệm đơn vị. Xem Chức năng kiểm tra đơn vị để biết thêm thông tin.

Phiên bản 2.0.0 của SDK Firebase cho Chức năng đám mây đã giới thiệu một thay đổi đột phá đối với dấu thời gian trong các chức năng do Firestore kích hoạt .

Để cập nhật SDK lên phiên bản mới nhất, hãy chạy phần sau trong thư mục chức năng:

npm install firebase-functions@latest --save
npm install firebase-admin@latest --save-exact

Bạn cũng nên cập nhật Firebase CLI lên phiên bản mới nhất:

npm install -g firebase-tools

Các thay đổi SDK ảnh hưởng đến tất cả các chức năng không đồng bộ (không phải HTTP)

SDK thay đổi theo loại trình kích hoạt

Thay đổi đối với mô phỏng chức năng

Các thay đổi SDK ảnh hưởng đến tất cả các chức năng nền (không phải HTTP)

Tham số sự kiện được chia thành dữ liệu và ngữ cảnh

Kể từ phiên bản 1.0 của SDK Firebase cho các chức năng đám mây, thông số event cho các chức năng không đồng bộ đã lỗi thời. Nó đã được thay thế bằng hai tham số mới: datacontext .

Tham số data đại diện cho dữ liệu đã kích hoạt chức năng. Các trường của tham số data được xác định bởi loại trình kích hoạt và thay đổi tương ứng. Ví dụ: đối với Cơ sở dữ liệu thời gian thực, tham số data là Ảnh DataSnapshot data . Xem các thay đổi theo loại trình kích hoạt để biết thêm thông tin về thông số data .

Tham số context cung cấp thông tin về việc thực thi chức năng. Giống nhau giữa các kiểu hàm không đồng bộ, context chứa các trường eventId , timestamp , eventType , resourceparams . Ngoài ra, các chức năng Cơ sở dữ liệu thời gian thực cung cấp thông tin xác thực cho người dùng đã kích hoạt chức năng. Dưới đây là một ví dụ về các trường ngữ cảnh được xác định trong một hàm do Cơ sở dữ liệu thời gian thực kích hoạt ghi:

exports.dbWrite = functions.database.ref('/path/with/{id}').onWrite((data, context) => {
  const authVar = context.auth; // Auth information for the user.
  const authType = context.authType; // Permissions level for the user.
  const pathId = context.params.id; // The ID in the Path.
  const eventId = context.eventId; // A unique event ID.
  const timestamp = context.timestamp; // The timestamp at which the event happened.
  const eventType = context.eventType; // The type of the event that triggered this function.
  const resource = context.resource; // The resource which triggered the event.
  // ...
});

Cú pháp khởi tạo mới cho firebase-admin

firebase-admin hiện được khởi tạo mà không có bất kỳ tham số nào trong thời gian chạy Chức năng đám mây.

Trước (<= v0.9.1)

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

Bây giờ (> = v1.0.0)

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

Lưu ý rằng bạn không thể chuyển vào functions.config().firebase khi khởi tạo. Xem phần sau để biết chi tiết về cách truy cập cấu hình trong v1.0.0.

functions.config().firebase đã bị xóa

functions.config().firebase đã bị xóa. Nếu bạn muốn truy cập các giá trị cấu hình từ dự án Firebase của mình, hãy sử dụng process.env.FIREBASE_CONFIG thay thế:

let firebaseConfig = JSON.parse(process.env.FIREBASE_CONFIG);
/* {  databaseURL: 'https://databaseName.firebaseio.com',
       storageBucket: 'projectId.appspot.com',
       projectId: 'projectId' }
*/

SDK thay đổi theo loại trình kích hoạt

Đối với nhiều trình kích hoạt chức năng được hỗ trợ, phiên bản 1.0 đã giới thiệu những thay đổi trong cách đặt tên cho các trường và phương thức dữ liệu. Phần này liệt kê các thay đổi theo loại trình kích hoạt.

Cơ sở dữ liệu thời gian thực

Dữ liệu sự kiện bây giờ là một Ảnh DataSnapshot dữ liệu

Trong các bản phát hành trước đó, event.data là một DeltaSnapshot ; từ phiên bản 1.0 trở đi, nó là một DataSnapshot .

Đối với sự kiện onWriteonUpdate , tham số dữ liệu có các trường beforeafter . Mỗi trong số này là một DataSnapshot với các phương thức tương tự có sẵn trong admin.database.DataSnapshot . Ví dụ:

Trước (<= v0.9.1)

exports.dbWrite = functions.database.ref('/path').onWrite((event) => {
  const beforeData = event.data.previous.val(); // data before the write
  const afterData = event.data.val(); // data after the write
});

Bây giờ (> = v1.0.0)

exports.dbWrite = functions.database.ref('/path').onWrite((change, context) => {
  const beforeData = change.before.val(); // data before the write
  const afterData = change.after.val(); // data after the write
});

Đối với onCreate , tham số dữ liệu là DataSnapshot đại diện cho dữ liệu vừa được thêm vào:

Trước (<= v0.9.1)

exports.dbCreate = functions.database.ref('/path').onCreate((event) => {
  const createdData = event.data.val(); // data that was created
});

Bây giờ (> = v1.0.0)

exports.dbCreate = functions.database.ref('/path').onCreate((snap, context) => {
  const createdData = snap.val(); // data that was created
});

Đối với onDelete , tham số dữ liệu là DataSnapshot đại diện cho dữ liệu vừa bị xóa:

Trước (<= v0.9.1)

exports.dbDelete = functions.database.ref('/path').onDelete((event) => {
  const deletedData = event.data.previous.val(); // data that was deleted
});

Bây giờ (> = v1.0.0)

exports.dbDelete = functions.database.ref('/path').onDelete((snap, context) => {
  const deletedData = snap.val(); // data that was deleted
});

Thuộc tính mới cho thông tin xác thực người dùng

EventContext.auth V1.0.0 đã giới thiệu hai thuộc tính mới để truy cập thông tin người dùng, bao gồm cả quyền, cho người dùng đã kích hoạt một chức năng.

  • EventContext.auth . Chứa thông tin như uid và mã thông báo xác thực của người dùng đã xác thực.
  • EventContext.authType . Chứa các cấp quyền, cho phép bạn phát hiện xem người dùng có phải là người dùng quản trị viên hay không.

Các nhà phát triển sử dụng các trường event.auth không có tài liệu nên cập nhật bất kỳ mã liên quan nào để sử dụng các thuộc tính mới này.

adminRef thay thế bằng ref

Tham chiếu .adminRef đã bị xóa để có lợi cho tham chiếu .ref hiện được ủy quyền với đặc quyền của quản trị viên . Cách sử dụng .ref - như một tham chiếu đến thay đổi được ủy quyền với tư cách là người dùng đã kích hoạt thay đổi - không còn được hỗ trợ.

Trước (<= v0.9.1)

exports.dbCreate = functions.database.ref('/path/{uid}').onCreate((event) => {
  const parentRef = event.data.adminRef.parent; // The Database reference to the parent authorized with admin privileges.

  const parentRefAsUser = event.data.ref.parent; // The Database reference to the parent authorized as the user which triggered the change.
});

Bây giờ (> = v1.0.0)

exports.dbCreate = functions.database.ref('/path/{uid}').onCreate((snap, context) => {
  const parentRef = snap.ref.parent; // The Database reference to the parent authorized with admin privileges
});

Bạn vẫn có thể thực hiện các thay đổi do người dùng ủy quyền đối với Cơ sở dữ liệu thời gian thực bằng SDK quản trị viên:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

exports.impersonateMakeUpperCase = functions.database.ref('/messages/{pushId}/original')
    .onCreate((snap, context) => {
      const appOptions = JSON.parse(process.env.FIREBASE_CONFIG);
      appOptions.databaseAuthVariableOverride = context.auth;
      const app = admin.initializeApp(appOptions, 'app');
      const uppercase = snap.val().toUpperCase();
      const ref = snap.ref.parent.child('uppercase');

      const deleteApp = () => app.delete().catch(() => null);

      return app.database().ref(ref).set(uppercase).then(res => {
        // Deleting the app is necessary for preventing concurrency leaks
        return deleteApp().then(() => res);
      }).catch(err => {
        return deleteApp().then(() => Promise.reject(err));
      });
    });

Cloud Firestore

Giống như những thay đổi của Cơ sở dữ liệu thời gian thực cho phiên bản 1.0, onWriteonUpdate có một tham số dữ liệu có các trường beforeafter . Các sự kiện cho onCreateonDelete đều có một tham số dữ liệu là Cloud Firestore DocumentSnapshot .

Trước (<= v0.9.1)

exports.dbWrite = functions.firestore.document('/doc/path').onWrite((event) => {
  const beforeData = event.data.previous.data(); // data before the write
  const afterData = event.data.data(); // data after the write
});

Bây giờ (> = v1.0.0)

exports.dbWrite = functions.firestore.document('/doc/path').onWrite((change, context) => {
  const beforeData = change.before.data(); // data before the write
  const afterData = change.after.data(); // data after the write
});

Sự kiện cho onCreateonDelete đều có một tham số dữ liệu là DocumentSnapshot .

Trước (<= v0.9.1)

exports.dbDelete = functions.firestore.document('/doc/path').onDelete((event) => {
  const deletedData = event.data.previous.data(); // data that was deleted
});

Bây giờ (> = v1.0.0)

exports.dbDelete = functions.firestore.document('/doc/path').onDelete((snap, context) => {
  const deletedData = snap.data(); // data that was deleted
});

Thay đổi đột phá trong v2.0.0 cho dấu thời gian của Firestore

Kể từ v2.0.0 của SDK Firebase cho Chức năng đám mây, các giá trị dấu thời gian trong ảnh chụp nhanh Firestore nhận được bên trong một hàm là các đối tượng Dấu thời gian Firestore . Điều này áp dụng cho snapshot.createTime , snapshot.updateTime , snapshot.readTime và bất kỳ giá trị dấu thời gian nào trong snapshot.data()

Bây giờ (> = v2.0.0)

exports.dbCreate = functions.firestore.document('/doc/path').onCreate((snap, context) => {
  //seconds of UTC time since Unix epoch
  console.log(snap.createTime.seconds);

  //fractions of a second at nanosecond resolution, 0 to 999,999,999
  console.log(snap.createTime.nanoseconds);
});

Xác thực

Trong các bản phát hành trước, event.data.metadata chứa các trường không được dùng nữa là createdAtlastSignedInAt . Phiên bản 1.0 loại bỏ các lĩnh vực hoàn toàn và thay thế chúng với creationTimelastSignInTime trường trong userRecord.metadata tham số.

Trước (<= v0.9.1)

// This code won't work with Cloud Functions SDK 1.0 and higher!
exports.authAction = functions.auth.user().onCreate((event) => {
  const userMetadata = event.data.metadata;

  const creationTime = userMetadata.createdAt; // 2016-12-15T19:37:37.059Z
  const lastSignInTime = userMetadata.lastSignedInAt; // 2018-01-03T16:23:12.051Z
}

Bây giờ (> = v1.0.0)

exports.authAction = functions.auth.user().onCreate((userRecord, context) => {
  const creationTime = userRecord.metadata.creationTime; // 2016-12-15T19:37:37.059Z
  const lastSignInTime = userRecord.metadata.lastSignInTime; // 2018-01-03T16:23:12.051Z
}

Crashlytics

Trong phiên bản 1.0, trình xử lý sự kiện kích hoạt mỗi khi sự cố mới xảy ra là onNew . Trình xử lý trước có tên onNewDetected đã bị xóa.

Trước (<= v0.9.1)

exports.newIssue = functions.crashlytics.issue().onNewDetected((event) => {
  const issue = event.data;

  const issueId = issue.issueId;
  const issueTitle = issue.issueTitle;
  const appName = issue.appInfo.appName;
  const appId = issue.appInfo.appId;
  const appPlatform = issue.appInfo.appPlatform;
  const latestAppVersion = issue.appInfo.latestAppVersion;
  const createTime = issue.createTime;
}

Hiện tại (> = v1.0.0)

exports.newIssue = functions.crashlytics.issue().onNew((issue, context) => {
  const issueId = issue.issueId;
  const issueTitle = issue.issueTitle;
  const appName = issue.appInfo.appName;
  const appId = issue.appInfo.appId;
  const appPlatform = issue.appInfo.appPlatform;
  const latestAppVersion = issue.appInfo.latestAppVersion;
  const createTime = issue.createTime;
}

Lưu trữ

Trình xử lý sự kiện onChange đã bị xóa. Thay vào đó, v 1.0 hỗ trợ các sự kiện sau:

  • onArchive Chỉ được gửi khi một nhóm đã bật lập phiên bản đối tượng . Sự kiện này chỉ ra rằng phiên bản trực tiếp của một đối tượng đã trở thành phiên bản được lưu trữ, vì nó đã được lưu trữ hoặc vì nó đã bị ghi đè bởi việc tải lên một đối tượng cùng tên.
  • onDelete Đã gửi khi một đối tượng đã bị xóa vĩnh viễn. Điều này bao gồm các đối tượng bị ghi đè hoặc bị xóa như một phần của cấu hình vòng đời của nhóm. Đối với các nhóm có bật lập phiên bản đối tượng , điều này không được gửi khi một đối tượng được lưu trữ (xem onArchive ), ngay cả khi quá trình lưu trữ diễn ra thông qua phương thức storage.objects.delete .
  • onFinalize Đã gửi khi một đối tượng mới (hoặc một thế hệ mới của một đối tượng hiện có) được tạo thành công trong thùng. Điều này bao gồm việc sao chép hoặc viết lại một đối tượng hiện có. Tải lên không thành công không kích hoạt sự kiện này.
  • onMetadataUpdate Được gửi khi siêu dữ liệu của một đối tượng hiện có thay đổi.

Trước (<= v0.9.1)

exports.processFile = functions.storage.object().onChange((event) => {
  const object = event.data;

  const filePath = object.name; // Path of the File
  const contentType = object.contentType; // Mime type of the file

  // Exit if this is a deletion event.
  if (object.resourceState === 'not_exists') {
    console.log('This file was deleted.');
    return null;
  }

  // Exit if file exists but is not new and is only being triggered
  // because of a metadata change.
  if (resourceState === 'exists' && metageneration > 1) {
    console.log('This is a metadata change event.');
    return null;
  }

  // ...
}

Bây giờ (> = v1.0.0)

exports.processFile = functions.storage.object().onFinalize((object, context) => {
  const filePath = object.name; // Path of the File
  const contentType = object.contentType; // Mime type of the file

  // ...
}

exports.fileDeleted = functions.storage.object().onDelete((object, context) => {
  console.log('This file was deleted.');
}

exports.metadataUpdated = functions.storage.object().onMetadataUpdate((object, context) => {
  console.log('This is a metadata change event.');
}

Pub / Sub

Vì loại trình kích hoạt cơ bản đã thay đổi, bạn phải đổi tên và triển khai lại các hàm pub / sub. Không cần thay đổi mã chức năng.

Để cập nhật các chức năng pub / sub:

  1. Đổi tên hàm. Ví dụ: đổi tên 'myPubSubFunction' thành 'myNewPubSubFunction'.
  2. Chỉ triển khai chức năng đó bằng cách sử dụng triển khai từng phần:

    firebase deploy --only functions:myNewPubSubFunction

  3. Sau khi triển khai thành công 'myNewPubSubFunction', hãy xóa chức năng lỗi thời trước v.1.0.0 bằng cách triển khai tất cả các chức năng:

    firebase deploy --only functions

Trong khoảng thời gian ngắn giữa các lệnh triển khai này, bạn có thể nhận được các trình kích hoạt trùng lặp. Để xử lý trường hợp này và để hoạt động bình thường, hãy đảm bảo viết các hàm Idempotent .

Để tìm hiểu thêm, hãy xem tham chiếu API .

Thay đổi đối với mô phỏng chức năng

  • firebase serve hiện phục vụ cả chức năng HTTP và lưu trữ theo mặc định.
  • firebase experimental:functions:shell , mô phỏng tất cả các chức năng, đã được đổi tên thành các firebase functions:shell .

Thay đổi cú pháp cho trình bao hàm

Cú pháp để gọi hàm thông qua trình bao hàm đã được cập nhật để phản ánh cú pháp cho firebase-functions v1.0.0 +.

// Inside functions shell

// To emulate database writes done by an administrative user:
myDbFunction(‘data’)

// To emulate database writes done by an authenticated user:
myDbFunction(‘data’, { auth: { uid: ‘abc’ }})

// To emulate database writes done by an unauthenticated user:
myDbFunction(‘data’, { authMode: ‘UNAUTHENTICATED’)