Cloud Functions ile etkinlikleri şuradan yönetebilirsiniz:
İstemci kodunun güncellenmesine gerek kalmadan Firebase Realtime Database.
Cloud Functions, tam yönetici erişimiyle Realtime Database işlemi çalıştırmanıza olanak tanır
ve Realtime Database üzerinde yapılan her değişikliğin işlenmesini sağlar.
ayrı ayrı düzenleyebilirsiniz. Şu bağlantı üzerinden Firebase Realtime Database değişiklik yapabilirsiniz:
DataSnapshot
Yönetici SDK'sı aracılığıyla da erişebilirsiniz.
Firebase Realtime Database işlevi, tipik bir yaşam döngüsünde şunları yapar:
- Belirli bir Realtime Database konumunda yapılan değişiklikleri bekler.
- Bir etkinlik gerçekleştiğinde tetiklenir ve görevlerini yerine getirir (bkz. Ne yapabilirim? Cloud Functions ile birlikte mi? örnek olarak kullanım alanı) ekleyebilirsiniz.
- Depolanan verilerin anlık görüntüsünü içeren bir veri nesnesi alır belirtilen dokümanda olması gerekir.
Realtime Database işlevini tetikleyin
Realtime Database etkinlikleri için yeni işlevler oluşturun
functions.database
ile. Alıcı:
işlevin ne zaman tetikleneceğini kontrol edin, etkinlik işleyicilerden birini belirtin ve
etkinlikleri dinleyacağı Realtime Database yolunu belirtin.
Etkinlik işleyiciyi ayarlama
İşlevler, Realtime Database etkinliklerini iki kesinlik düzeyinde işlemenizi sağlar; sadece içerik oluşturma, güncelleme ve veya bir yoldaki herhangi bir değişikliği dinleyebilirsiniz. Cloud Functions, Realtime Database için şu etkinlik işleyicileri destekler:
- Realtime Database ürününde veri oluşturulduğunda, güncellendiğinde veya silindiğinde tetiklenen
onWrite()
. onCreate()
, Realtime Database içinde yeni veriler oluşturulduğunda tetiklenir.onUpdate()
, Realtime Database içinde veriler güncellendiğinde tetiklenir .- Realtime Database ürününden veriler silindiğinde tetiklenen
onDelete()
.
Örneği ve yolu belirtin
İşlevinizin ne zaman ve nerede tetikleneceğini kontrol etmek için ref(path)
çağrısı yapın
bir yol belirtin ve isteğe bağlı olarak bir Realtime Database örneği belirtin
instance('INSTANCE_NAME')
ile. Google Takvim'i
bir örnek belirtirseniz işlev şunun için varsayılan Realtime Database örneğine dağıtılır:
Firebase projesini. Ö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 içindeki belirli bir yoldaki yazma işlemlerini işlemesi için yönlendirir
Realtime Database örneği. Yol özellikleri, bir yola dokunan tüm yazmalarla eşleşir,
yazmalar dahil
daha iyi olur. Yolun belirli bir
/foo/bar
olarak fonksiyonunuz için şu konumların her ikisindeki etkinliklerle eşleşir:
/foo/bar
/foo/bar/baz/really/deep/path
Her iki durumda da Firebase, etkinliğin /foo/bar
olduğunda gerçekleştiğini ve
Etkinlik verilerinde de
/foo/bar
adresindeki eski ve yeni veriler. Etkinlik verileri büyükse
tek bir işlev yerine daha derin yollarda birden çok işlev kullanmayı düşünün
işlevini kullanın. En iyi performans için yalnızca istekte bulunun
mümkün olan en derin düzeyde veri toplar.
Bir yol bileşenini kıvrık şekilde sarmalayarak joker karakter olarak belirtebilirsiniz
parantezler; ref('foo/{bar}')
, /foo
öğesinin herhangi bir alt öğesiyle eşleşir. Bu değerlerin
joker karakter yol bileşenleri,
EventContext.params
işlevinizin nesnesi. Bu örnekte, değer
context.params.bar
Joker karakter içeren yollar, tek bir yazma işleminde birden fazla etkinlikle eşleşebilir. Ek
{
"foo": {
"hello": "world",
"firebase": "functions"
}
}
"/foo/{bar}"
yoluyla bir kez "hello": "world"
ile iki kez eşleşir
ve "firebase": "functions"
ile tekrar deneyin.
Etkinlik verilerini işleme
Bir Realtime Database etkinliği işlenirken döndürülen veri nesnesi
DataSnapshot
onWrite
veya onUpdate
etkinlikleri için
ilk parametre, iki anlık görüntü içeren bir Change
nesnesi
önceki veri durumunu temsil eden
ve tetikleyici etkinlikten sonra gösterilir. 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 yol, ilgili 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
Kaynak: EventContext.auth
ve EventContext.authType
,
erişebilirsiniz
etkinliği tetikleyen kullanıcıya ait izinler dahil olmak üzere
bir işlev olarak tanımlanır. Bu, güvenlik kurallarının zorunlu kılınması açısından
işlevinizin, kullanıcının özelliklerine göre
izin düzeyi:
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, kullanıcı kimlik doğrulama bilgilerinden yararlanarak "başkasının kimliğini kullanabilirsiniz" kullanıcı kullanıcı adına yazma işlemleri gerçekleştirebilir. uygulama örneğini aşağıda gösterildiği gibi yükleyebilirsiniz:
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ğer okunuyor
Change
nesnesi bir
before
Realtime Database önce
unutmayın. before
özelliği, tümünün geçerli olduğu bir DataSnapshot
döndürür.
yöntemleri (örneğin,
val()
ve
exists()
)
önceki değere başvuruda bulunur. Yeni değeri
orijinal DataSnapshot
veya okuma
after
Herhangi bir Change
üzerindeki bu mülk, değeri temsil eden başka bir DataSnapshot
etkinlikten sonra verilerin durumunu gösterir.
Örneğin, before
özelliği, işlevin yalnızca
ilk oluşturulduğunda metni büyük harfle yazar:
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);
});