Cloud Functions ile etkinlikleri
İstemci kodunun güncellenmesine gerek kalmadan Firebase Realtime Database.
Cloud Functions, Realtime Database işlemlerini yöneticilerle birlikte çalıştırmanızı sağlar
ve Realtime Database'de yapılan her değişikliğin işlenmesini
ayrı ayrı düzenleyebilirsiniz. Firebase Realtime Database'de değişiklik yapmak için şurayı kullanabilirsiniz:
DataSnapshot
Yönetici SDK'sı üzerinden kullanabilirsiniz.
Firebase Realtime Database işlevi tipik bir yaşam döngüsünde şu işlemleri 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 ilgili 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 tetikleme
Realtime Database etkinlikleri için yeni işlevler oluşturma
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 belirlilik düzeyinde yönetmenizi 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:
onWrite()
, Realtime Database'de veri oluşturulduğunda, güncellendiğinde veya silindiğinde tetiklenir.onCreate()
, Realtime Database'de yeni veri oluşturulduğunda tetiklenir.onUpdate()
, Realtime Database'de veriler güncellendiğinde tetiklenir .onDelete()
, veriler Realtime Database'den silindiğinde tetiklenir .
Örneği ve yolu belirtin
İşlevinizin ne zaman ve nerede tetikleneceğini kontrol etmek için ref(path)
çağrısı yapın
seçeneğini kullanın ve isteğe bağlı olarak bir Realtime Database örneği belirtin
instance('INSTANCE_NAME')
ile. Google
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
örneğidir. 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
itibarıyla 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 farklı işlemler gerçekleştirmesini
izin düzeyi:
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, 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
BigQuery'den önce Realtime Database'e nelerin kaydedildiğini incelemenize olanak tanıyan
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);
});