Cloud Functions ile istemci kodunu güncellemeye gerek kalmadan Firebase Realtime Database içindeki etkinlikleri yönetebilirsiniz.
Cloud Functions, tam yönetici ayrıcalıklarıyla Realtime Database işlemleri yapmanıza olanak tanır ve Realtime Database üzerinde yapılan her değişikliğin ayrı ayrı işlenmesini sağlar. DataSnapshot veya Admin SDK üzerinden Firebase Realtime Database değişiklik yapabilirsiniz.
Tipik bir yaşam döngüsünde Firebase Realtime Database işlevi şunları yapar:
- Belirli bir Realtime Database konumunda değişiklik yapılmasını bekler.
- Bir etkinlik gerçekleştiğinde tetiklenir ve görevlerini yerine getirir (Cloud Functions ile neler yapabilirim? bölümüne bakın). örnek kullanım alanlarını inceleyin).
- Belirtilen dokümanda depolanan verilerin anlık görüntüsünü içeren bir veri nesnesi alır.
Realtime Database işlevini tetikleme
functions.database ile Realtime Database etkinlikleri için yeni işlevler oluşturun. İşlevin ne zaman tetikleneceğini kontrol etmek için etkinlik işleyicilerden birini ve etkinlikleri dinleyeceği Realtime Database yolunu belirtin.
Etkinlik işleyiciyi ayarlama
Functions, Realtime Database etkinliklerini iki farklı düzeyde işlemenize olanak tanır. Yalnızca oluşturma, güncelleme veya silme etkinliklerini dinleyebilir ya da bir yolda yapılan her türlü değişikliği dinleyebilirsiniz. Cloud Functions, Realtime Database için şu etkinlik işleyicileri destekler:
onWrite(): Realtime Database içinde veri oluşturulduğunda, güncellendiğinde veya silindiğinde tetiklenir.onCreate(): Realtime Database içinde yeni veri oluşturulduğunda tetiklenir.- Realtime Database içinde veri güncellendiğinde tetiklenen
onUpdate(). onDelete(): Realtime Database üzerinden veri silindiğinde tetiklenir .
Örneği ve yolu belirtme
İşlevinizin ne zaman ve nerede tetikleneceğini kontrol etmek için ref(path) yöntemini çağırarak bir yol belirtin ve isteğe bağlı olarak instance('INSTANCE_NAME') ile bir Realtime Database örneği belirtin. Bir örnek belirtmezseniz işlev, Firebase projesinin varsayılan Realtime Database örneğine dağıtılır. Örneğin:
- Varsayılan Realtime Database örneği:
functions.database.ref('/foo/bar') - "my-app-db-2" adlı örnek:
functions.database.instance('my-app-db-2').ref('/foo/bar')
Bu yöntemler, işlevinizi Realtime Database örneğindeki belirli bir yolda yazma işlemlerini gerçekleştirmeye yönlendirir. Yol spesifikasyonları, bir yola dokunan tüm yazma işlemleriyle eşleşir. Buna, yolun altındaki herhangi bir yerde gerçekleşen yazma işlemleri de dahildir. İşlevinizin yolunu /foo/bar olarak ayarlarsanız bu iki konumdaki etkinliklerle eşleşir:
/foo/bar
/foo/bar/baz/really/deep/path
Her iki durumda da Firebase, etkinliğin /foo/bar tarihinde gerçekleştiğini varsayar ve etkinlik verileri, /foo/bar tarihindeki eski ve yeni verileri içerir. Etkinlik verileri büyük olabilecekse veritabanınızın köküne yakın tek bir işlev yerine daha derin yollarda birden fazla işlev kullanmayı düşünün. En iyi performans için yalnızca mümkün olan en derin düzeyde veri isteyin.
Bir yol bileşenini süslü parantez içine alarak joker karakter olarak belirtebilirsiniz. ref('foo/{bar}'), /foo öğesinin tüm alt öğeleriyle eşleşir. Bu joker karakter yol bileşenlerinin değerleri, işlevinizin EventContext.params nesnesinde bulunur. Bu örnekte değer, context.params.bar olarak kullanılabilir.
Joker karakter içeren yollar, tek bir yazma işlemindeki birden fazla etkinlikle eşleşebilir. An insert of
{
"foo": {
"hello": "world",
"firebase": "functions"
}
}
"/foo/{bar}" yoluyla iki kez eşleşir: bir kez "hello": "world" ile ve tekrar "firebase": "functions" ile.
Etkinlik verilerini işleme
Bir Realtime Database etkinliği işlenirken döndürülen veri nesnesi bir DataSnapshot olur.
onWrite veya onUpdate etkinlikleri için ilk parametre, tetikleyici etkinlikten önceki ve sonraki veri durumunu temsil eden iki anlık görüntü içeren bir Change nesnesidir. onCreate ve onDelete etkinlikleri için döndürülen veri nesnesi, oluşturulan veya silinen verilerin anlık görüntüsüdür.
Bu örnekte işlev, belirtilen yolun anlık görüntüsünü alır, bu konumdaki dizeyi büyük harfe dönüştürür ve değiştirilen dizeyi veritabanına yazar:
// Listens for new messages added to /messages/:pushId/original and creates an // uppercase version of the message to /messages/:pushId/uppercase exports.makeUppercase = functions.database.ref('/messages/{pushId}/original') .onCreate((snapshot, context) => { // Grab the current value of what was written to the Realtime Database. const original = snapshot.val(); functions.logger.log('Uppercasing', context.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 snapshot.ref.parent.child('uppercase').set(uppercase); });
Kullanıcı kimlik doğrulama bilgilerine erişme
EventContext.auth ve EventContext.authType üzerinden, bir işlevi tetikleyen kullanıcının izinler dahil olmak üzere kullanıcı bilgilerine erişebilirsiniz. Bu, güvenlik kurallarını uygulamak ve işlevinizin kullanıcının izin düzeyine göre farklı işlemler gerçekleştirmesine olanak tanımak için yararlı olabilir:
const functions = require('firebase-functions/v1');
const admin = require('firebase-admin');
exports.simpleDbFunction = functions.database.ref('/path')
.onCreate((snap, context) => {
if (context.authType === 'ADMIN') {
// do something
} else if (context.authType === 'USER') {
console.log(snap.val(), 'written by', context.auth.uid);
}
});
Ayrıca, bir kullanıcının "kimliğine bürünmek" ve kullanıcı adına yazma işlemleri gerçekleştirmek için kullanıcı kimlik doğrulama bilgilerinden yararlanabilirsiniz. Eşzamanlılık sorunlarını önlemek için uygulama örneğini aşağıda gösterildiği gibi sildiğinizden emin olun:
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));
});
});
Önceki değeri okuma
Change nesnesinin, etkinlikten önce Realtime Database nesnesine nelerin kaydedildiğini incelemenize olanak tanıyan bir before özelliği vardır. before özelliği, tüm yöntemlerin (ör. val() ve exists()) önceki değere başvurduğu bir DataSnapshot döndürür. Orijinal DataSnapshot değerini kullanarak veya after özelliğini okuyarak yeni değeri tekrar okuyabilirsiniz. Herhangi bir Change üzerindeki bu özellik, etkinlik gerçekleştikten sonraki veri durumunu temsil eden başka bir DataSnapshot değeridir.
Örneğin, before özelliği, işlevin yalnızca ilk oluşturulduğunda metni büyük harfe dönüştürmesini sağlamak için kullanılabilir:
exports.makeUppercase = functions.database.ref('/messages/{pushId}/original')
.onWrite((change, context) => {
// Only edit data when it is first created.
if (change.before.exists()) {
return null;
}
// Exit when the data is deleted.
if (!change.after.exists()) {
return null;
}
// Grab the current value of what was written to the Realtime Database.
const original = change.after.val();
console.log('Uppercasing', context.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 change.after.ref.parent.child('uppercase').set(uppercase);
});