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 için Firebase SDK yükseltme kılavuzu: beta sürüm 1.0 veya üzeri

Firebase SDK for Cloud Functions'ın 1.0.0 sürümü, API'de bazı önemli değişiklikler getirdi. event.data biçiminin data ve context parametreleriyle değiştirilmesi olan birincil değişiklik, tüm eşzamansız (HTTP olmayan) işlevleri etkiler. Güncellenen SDK, bir birim test yardımcı SDK'sı olan firebase-functions-test ile de kullanılabilir. Daha fazla bilgi için Birim Test İşlevlerine bakın.

Cloud Functions için Firebase SDK'nın 2.0.0 sürümü , Firestore tarafından tetiklenen işlevlerdeki zaman damgaları için bir kırılma değişikliği getirdi.

SDK'ları en son sürüme güncellemek için işlevler klasöründe aşağıdakileri çalıştırın:

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

Ayrıca Firebase CLI'yi en son sürüme güncellemelisiniz:

npm install -g firebase-tools

Tüm zaman uyumsuz (HTTP olmayan) işlevleri etkileyen SDK değişiklikleri

Tetikleyici türüne göre SDK değişiklikleri

İşlev öykünmesindeki değişiklikler

Tüm arka plan (HTTP olmayan) işlevlerini etkileyen SDK değişiklikleri

Olay parametresi, veri ve bağlama bölünür

Cloud Functions için Firebase SDK'sının 1.0 sürümünden itibaren, eşzamansız işlevler için event parametresi artık kullanılmamaktadır. İki yeni parametre ile değiştirildi: data ve context .

data parametresi, işlevi tetikleyen verileri temsil eder. data parametresinin alanları, tetikleyici türüne göre belirlenir ve buna göre değişir. Örneğin, Gerçek Zamanlı Veritabanı için data parametresi bir DataSnapshot . data parametresi hakkında daha fazla bilgi için tetik türüne göre değişikliklere bakın.

context parametresi, işlevin yürütülmesi hakkında bilgi sağlar. Asenkron fonksiyonlar türleri arasında Özdeş, context alanları içeren eventId , timestamp , eventType , resource ve params . Ek olarak, Gerçek Zamanlı Veritabanı işlevleri, işlevi tetikleyen kullanıcı için kimlik doğrulama bilgileri sağlar. Gerçek Zamanlı Veritabanı yazma işlemi tarafından tetiklenen bir işlevde tanımlanan bağlam alanlarına bir örnek:

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

firebase-admin için yeni başlatma sözdizimi

firebase-admin artık Cloud Functions çalışma zamanı içinde herhangi bir parametre olmadan başlatıldı.

Öncesi (<= v0.9.1)

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

Şimdi (>= v1.0.0)

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

functions.config().firebase artık functions.config().firebase . v1.0.0'da yapılandırmaya nasıl erişileceğiyle ilgili ayrıntılar için aşağıdaki bölüme bakın.

functions.config().firebase kaldırıldı

functions.config().firebase kaldırıldı. Firebase projenizdeki yapılandırma değerlerine erişmek istiyorsanız bunun yerine process.env.FIREBASE_CONFIG kullanın:

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

Tetikleyici türüne göre SDK değişiklikleri

Desteklenen birçok işlev tetikleyicisi için v 1.0, veri alanları ve yöntemleri için adlandırmada değişiklikler getirdi. Bu bölüm, tetik türüne göre değişiklikleri listeler.

Gerçek Zamanlı Veritabanı

Olay verileri artık bir DataSnapshot

Önceki sürümlerde event.data bir DeltaSnapshot ; v 1.0'dan itibaren bu bir DataSnapshot .

onWrite ve onUpdate olayları için data parametresinin before ve after alanları vardır. Bunların her biri, admin.database.DataSnapshot içinde bulunan yöntemlerle aynı olan bir DataSnapshot . Örneğin:

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

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

onCreate için data parametresi, yeni eklenen verileri temsil eden bir DataSnapshot :

Öncesi (<= v0.9.1)

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

Şimdi (>= v1.0.0)

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

onDelete için data parametresi, yeni silinen verileri temsil eden bir DataSnapshot :

Öncesi (<= v0.9.1)

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

Şimdi (>= v1.0.0)

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

Kullanıcı kimlik doğrulama bilgileri için yeni özellikler

EventContext.auth V1.0.0, bir işlevi tetikleyen kullanıcı için izinler de dahil olmak üzere kullanıcı bilgilerine erişmek için iki yeni özellik sundu.

  • EventContext.auth . Gibi bilgileri içerir uid ve yetkilendirilmiş kullanıcıların kimlik doğrulama belirteci.
  • EventContext.authType . Örneğin, kullanıcının bir yönetici kullanıcı olup olmadığını algılamanıza olanak tanıyan izin düzeylerini içerir.

Belgelenmemiş event.auth alanlarını kullanan geliştiriciler, bu yeni özellikleri kullanmak için ilgili tüm kodları güncellemelidir.

adminRef , ref değiştirildi

.adminRef referansı , artık yönetici ayrıcalıklarıyla yetkilendirilen .ref referansı lehine kaldırıldı. .ref kullanmanın eski yolu — değişikliği tetikleyen kullanıcı olarak yetkilendirilen değişikliğe referans olarak — artık desteklenmemektedir.

Öncesi (<= 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.
});

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

Yönetici SDK'sını kullanarak Realtime Database'de yine de kullanıcı tarafından yetkilendirilen değişiklikleri gerçekleştirebilirsiniz:

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

Bulut Firestore

v 1.0 için Gerçek Zamanlı Veritabanı değişikliklerine çok benzer şekilde, onWrite ve onUpdate alanları before ve after olan bir veri parametresine sahiptir. onCreate ve onDelete her ikisi de Cloud Firestore DocumentSnapshot olan bir veri parametresine sahiptir.

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

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

onCreate ve onDelete her ikisi de DocumentSnapshot olan bir data parametresine sahiptir.

Öncesi (<= v0.9.1)

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

Şimdi (>= v1.0.0)

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

Firestore zaman damgaları için v2.0.0'daki Son Değişiklik

Cloud Functions için Firebase SDK v2.0.0'dan itibaren, bir işlevin içinde alınan bir Firestore anlık görüntüsündeki zaman damgası değerleri, Firestore Timestamp nesneleridir. Bu, snapshot.createTime , snapshot.updateTime , snapshot.readTime ve snapshot.data() içindeki tüm zaman damgası değerleri için geçerlidir.

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

kimlik doğrulama

Önceki sürümlerde event.data.metadata , createdAt ve lastSignedInAt , kullanımdan kaldırılan alanları lastSignedInAt . Sürüm 1.0 tamamen kaldırır bu alanları ve deÄŸiÅŸtirecektir onları creationTime ve lastSignInTime alanlar userRecord.metadata parametresi.

Öncesi (<= 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
}

Şimdi (>= 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

v 1.0'da, her yeni sorun oluştuğunda onNew olay işleyici onNew . onNewDetected adlı önceki işleyici kaldırıldı.

Öncesi (<= 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;
}

Şimdi (>= 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;
}

Bulut depolama

onChange olay işleyicisi kaldırıldı. Bunun yerine v 1.0 şu olayları destekler:

  • onArchive Yalnızca bir onArchive nesne sürümü oluşturmayı etkinleştirdiğinde gönderilir. Bu olay, bir nesnenin canlı sürümünün, arşivlendiğinden veya aynı ada sahip bir nesnenin karşıya yüklenmesiyle üzerine yazıldığından, arşivlenmiş bir sürüm haline geldiğini gösterir.
  • onDelete Bir nesne kalıcı olarak silindiğinde gönderilir. Buna, paketin yaşam döngüsü yapılandırmasının bir parçası olarak üzerine yazılan veya silinen nesneler dahildir. İle kovalar için nesnenin sürümlendirmesini etkin bir nesne (bkz arşivlenirse, bu gönderilmez onArchive arşiv aracılığıyla gerçekleşse bile) storage.objects.delete yöntemiyle.
  • onFinalize yeni bir nesne (veya mevcut bir nesnenin yeni nesli) başarıyla oluşturulduğunda gönderilir. Bu, mevcut bir nesneyi kopyalamayı veya yeniden yazmayı içerir. Başarısız bir yükleme bu olayı tetiklemez.
  • onMetadataUpdate Varolan bir nesnenin meta verileri değiştiğinde gönderilir.

Öncesi (<= 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;
  }

  // ...
}

Şimdi (>= 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

Temel tetikleyici türü değiştiği için Pub/Sub işlevlerini yeniden adlandırmanız ve yeniden dağıtmanız gerekir. Fonksiyon kodunda herhangi bir değişiklik gerekli değildir.

pub/sub fonksiyonlarını güncellemek için:

  1. İşlevi yeniden adlandırın. Örneğin, 'myPubSubFunction' adını 'myNewPubSubFunction' olarak yeniden adlandırın.
  2. Kısmi dağıtım kullanarak yalnızca bu işlevi dağıtın:

    firebase deploy --only functions:myNewPubSubFunction

  3. 'myNewPubSubFunction'ı başarıyla dağıttıktan sonra, tüm işlevleri dağıtarak eski v.1.0.0 öncesi işlevi silin:

    firebase deploy --only functions

Bu dağıtım komutları arasındaki kısa süre boyunca, yinelenen tetikleyiciler alabilirsiniz. Bu durumu ele almak ve normal çalışma için, idempotent functions yazdığınızdan emin olun.

Daha fazla bilgi edinmek için API referansına bakın .

İşlev öykünmesindeki değişiklikler

  • firebase serve artık varsayılan olarak hem HTTP işlevlerine hem de barındırmaya hizmet ediyor.
  • Tüm işlevleri taklit eden firebase experimental:functions:shell , firebase functions:shell olarak yeniden adlandırıldı.

İşlevler kabuğu için sözdizimi değişiklikleri

İşlev kabuğu aracılığıyla işlevleri çağırmaya yönelik sözdizimi, firebase-functions v1.0.0+ sözdizimini yansıtacak şekilde güncellendi.

// 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’)