Cloud Functions ile, istemci kodunu güncellemenize gerek kalmadan Firebase Realtime Database'deki olayları yönetebilirsiniz. Cloud Functions, Gerçek Zamanlı Veritabanı işlemlerini tam yönetici ayrıcalıklarıyla çalıştırmanıza olanak tanır ve Gerçek Zamanlı Veritabanında yapılan her değişikliğin ayrı ayrı işlenmesini sağlar. Firebase Realtime Database değişiklikleriniDataSnapshot
veya Admin SDK aracılığıyla yapabilirsiniz.
Tipik bir yaşam döngüsünde, bir Firebase Realtime Database işlevi şunları yapar:
- Belirli bir Gerçek Zamanlı Veritabanı konumundaki değişiklikleri bekler.
- Bir olay meydana geldiğinde ve görevlerini gerçekleştirdiğinde tetikler (kullanım örnekleri için Cloud Functions ile ne yapabilirim? Konusuna bakın).
- Belirtilen belgede depolanan verilerin anlık görüntüsünü içeren bir veri nesnesi alır.
Gerçek Zamanlı Veritabanı işlevini tetikleyin
İle Gerçek Zamanlı Veri Tabanı olaylar için yeni fonksiyonlar oluşturun functions.database
. İşlevin ne zaman tetikleneceğini kontrol etmek için, olay işleyicilerinden birini belirtin ve olayları dinleyeceği Gerçek Zamanlı Veritabanı yolunu belirtin.
Olay işleyicisini ayarlayın
İşlevler, Gerçek Zamanlı Veritabanı olaylarını iki özgüllük düzeyinde işlemenizi sağlar; Özellikle yalnızca oluşturma, güncelleme veya silme olaylarını dinleyebilir veya bir yolda herhangi bir değişiklik olup olmadığını dinleyebilirsiniz. Cloud Functions, Realtime Database için şu olay işleyicilerini destekler:
- Gerçek Zamanlı Veritabanında veri oluşturulduğunda, güncellendiğinde veya silindiğinde tetikleyen
onWrite()
. - Gerçek Zamanlı Veritabanında yeni veri oluşturulduğunda tetikleyen
onCreate()
. -
onUpdate()
Gerçek Zamanlı Veritabanında güncellendiğinde tetiklenenonUpdate()
. -
onDelete()
Gerçek Zamanlı Veritabanından silindiğinde tetiklenenonDelete()
.
Örneği ve yolu belirtin
İşlevinizin ne zaman ve nerede tetikleneceğini kontrol etmek için, bir yol belirtmek üzere ref(path)
çağırın ve isteğe bağlı olarak instance('INSTANCE_NAME')
bir Gerçek Zamanlı Veritabanı örneği belirtin. Bir örnek belirtmezseniz işlev, Firebase projesi için varsayılan Gerçek Zamanlı Veritabanı örneğine dağıtılır Örneğin:
- Varsayılan Gerçek Zamanlı Veritabanı ö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 Gerçek Zamanlı Veritabanı örneğindeki belirli bir yoldaki yazmaları işlemeye yönlendirir. Yol özellikleri, altında herhangi bir yerde gerçekleşen yazmalar da dahil olmak üzere bir yola dokunan tüm yazmalarla eşleşir. İşlevinizin yolunu /foo/bar
olarak ayarlarsanız, bu iki konumdaki olaylarla eşleşir:
/foo/bar
/foo/bar/baz/really/deep/path
Her iki durumda da Firebase, olayın /foo/bar
ve olay verilerinin /foo/bar
eski ve yeni verileri içerdiğini yorumlar. Olay verileri büyükse, veritabanınızın köküne yakın tek bir işlev yerine daha derin yollarda birden çok 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 küme parantezleriyle çevreleyerek joker karakter olarak belirtebilirsiniz; ref('foo/{bar}')
, /foo
herhangi bir alt /foo
eşleşir. Bu joker karakter yolu bileşenlerinin değerleri, işlevinizin EventContext.params
nesnesinde mevcuttur. Bu örnekte değer, context.params.bar
olarak mevcuttur.
Joker karakterli yollar, tek bir yazma ile birden çok olayı eşleştirebilir. Bir ek
{
"foo": {
"hello": "world",
"firebase": "functions"
}
}
"/foo/{bar}"
iki kez eşleşir: bir kez "hello": "world"
ve tekrar "firebase": "functions"
.
Olay verilerini işleyin
Bir Gerçek Zamanlı Veritabanı olayını işlerken, döndürülen veri nesnesi birDataSnapshot
. onWrite
veya onUpdate
olayları için ilk parametre, tetikleme olayından önceki ve sonraki veri durumunu temsil eden iki anlık görüntü içeren bir Change
nesnesidir. İçin onCreate
ve onDelete
olaylar, döndürülen veri nesnesi oluşturulduğunda veya silinen verilerin anlık görüntüsüdür.
Bu örnekte, işlev olarak belirtilen yolu için anlık alır snap
veritabanına dize değiştirilmiş olduğu, büyük harfe bu konumda dize dönüştürür ve yazma:
// 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(); 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 snapshot.ref.parent.child('uppercase').set(uppercase); });
Kullanıcı kimlik doğrulama bilgilerine erişim
EventContext.auth
ve EventContext.authType
, bir işlevi tetikleyen kullanıcı için izinler dahil olmak üzere kullanıcı bilgilerine erişebilirsiniz. Bu, işlevinizin kullanıcının izin düzeyine bağlı olarak farklı işlemleri tamamlamasına izin vererek güvenlik kurallarını uygulamak için yararlı olabilir:
const functions = require('firebase-functions');
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ıyı "taklit etmek" 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 okumak
Change
nesnesi, olaydan önce Realtime Database'e kaydedilenleri incelemenizi sağlayan bir before
özelliğine sahiptir. before
mülkiyet döner bir DataSnapshot
burada tüm yöntemler (örneğin, val()
ve exists()
) önceki değerine karşılık gelir. Orijinal DataSnapshot
kullanarak veya after
özelliğini okuyarak yeni değeri tekrar okuyabilirsiniz. Herhangi bir Change
bu özellik, olay gerçekleştikten sonra verilerin durumunu temsil eden başka bir DataSnapshot
.
Örneğin, before
özelliği, işlevin yalnızca ilk oluşturulduğunda metni büyük harflerle yazmasını 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);
});