Google is committed to advancing racial equity for Black communities. See how.
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 Cloud Function: beta lên phiên bản 1.0 trở lên

Phiên bản 1.0.0 của SDK Firebase cho các 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 các tham số datacontext , ảnh hưởng đến tất cả các hàm 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 , firebase-functions-test đơn vị SDK đồng hành. 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 các chức năng đám mây đã giới thiệu một thay đổi đột phá cho dấu thời gian trong các chức năng kích hoạt Firestore .

Để 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
 

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 kích hoạt

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

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 chia thành dữ liệu và bối cảnh

Kể từ phiên bản 1.0 của SDK Firebase cho các chức năng đám mây, tham số event cho các chức năng không đồng bộ đã lỗi thời. Nó đã được thay thế bởi 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 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ố dataDataSnapshot . Xem các thay đổi theo loại kích hoạt để biết thêm thông tin về tham số data .

Tham số context cung cấp thông tin về thực thi của hàm. Các kiểu hàm không đồng bộ giống nhau, 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à ví dụ về các trường ngữ cảnh được xác định trong hàm được kích hoạt bởi cơ sở dữ liệu thời gian thực 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 của Cloud Function.

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 còn có thể truyề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 đã loại bỏ functions.config().firebase

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 kích hoạt

Đối với nhiều trình kích hoạt chức năng được hỗ trợ, v 1.0 đã giới thiệu các 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 kích hoạt.

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

Dữ liệu sự kiện bây giờ là DataSnapshot

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

Đối với các 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ùng các phương thức 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 quyền, cho người dùng đã kích hoạ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 được 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ị hay không.

Các nhà phát triển sử dụng các trường event.auth không có giấy tờ 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ởi ref

Tham chiếu .adminRef đã bị xóa vì tham chiếu .ref hiện được ủy quyền với các đặc quyền của quản trị viên . Cách sử dụng trước đây .ref tham chiếu đến thay đổi được ủy quyền 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 được người dùng ủy quyền cho 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));
      });
    });
 

Đám mây lửa

Giống như các thay đổi Cơ sở dữ liệu thời gian thực cho v 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à DocumentSnapshot đám mây.

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

Các sự kiện cho onCreateonDelete đều có 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 Firestore

Kể từ phiên bản 2.0.0 của Firebase SDK cho Cloud Function, các giá trị dấu thời gian trong ảnh chụp nhanh Firestore nhận được bên trong 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 dùng nữa được 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
}
 

Tai nạn

Trong phiên bản 1.0, trình xử lý sự kiện kích hoạt mỗi khi có sự cố mới xảy ra là onNew . Trình xử lý trước đó có tên trê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;
}
 

Bây giờ (> = 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 này:

  • onArchive Chỉ được gửi khi một nhóm đã kích hoạt 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 lưu trữ, vì nó được lưu trữ hoặc do nó được ghi đè bằng cách 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 được 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 phiên bản đối tượng , điều này không được gửi khi đối tượng được lưu trữ (xem onArchive ), ngay cả khi lưu trữ xảy 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 nhóm. Điều này bao gồm sao chép hoặc viết lại một đối tượng hiện có. Tải lên thất bại không kích hoạt sự kiện này.
  • onMetadataUpdate Đã 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.');
}
 

Quán rượu / phụ

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

Để cập nhật 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 một phần:

    firebase deploy --only functions:myNewPubSubFunction

  3. Sau khi triển khai thành công 'myNewPubSubFunction', hãy xóa hàm pre-v.1.0.0 đã lỗi thời 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 kích hoạt trùng lặp. Để xử lý trường hợp này và cho 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 tài liệu tham khảo API .

Thay đổi chức năng mô phỏ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 firebase functions:shell .

Thay đổi cú pháp cho hàm shell

Cú pháp gọi các hàm thông qua trình bao hàm đã được cập nhật để phản ánh cú pháp cho các hàm firebase 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’)