我编写了一个 Firebase 云函数,只要某个值 (timeTag
) 发生更改,它就会向主题推送通知:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.sendNotification = functions.database.ref('/books/{category}/pages/{page}/timeTag').onUpdate((change, context) => {
const category = context.params.category;
const page = context.params.page;
const categoryName = admin.database().ref('/books/'+`${category}`+'/name/');
const pageName = admin.database().ref('/books/'+`${category}`+'/pages/'+`${page}`+'/name/');
const data = change.data;
console.log(`${categoryName}`)
console.log(`${pageName}`)
console.log('Message received');
const payLoad = {
notification:{
title: 'There's an update in '+`${categoryName}`,
body: 'The page that's been updated is '+`${pageName}`,
sound: "default"
}
};
return admin.messaging().sendToTopic("all", payLoad);
});
数据库的结构如下:
books:
{categoryID}
name: categoryName
pages:
{pageID}
name: pageName
目前,名称是数据库中的完整 URL;例如,https://my-project.firebaseio.com/books/-LxzDYhk-t3LGRGifEyz/name
。在本例中,name
是我想要的值的键。这是有问题的,因为 FCM 通知最终是 There's an update in https://my-project.firebaseio.com/books/-LxzDYhk-t3LGRGifEyz/name
而不是 There's an update in类别一
。
我想要做的是将变量设置为 name
键的值,而不是 URL 本身。我错过了什么?
提前致谢!
最佳答案
您正在创建对数据的引用,但实际上并未获取它。你需要这样的东西:
exports.sendNotification = functions.database.ref('/books/{category}/pages/{page}/timeTag').onUpdate(async (change, context) => {
// ...
const categoryNameSnap = await admin.database().ref('/books/'+`${category}`+'/name/').once('value');
const categoryName = categoryNameSnap.val();
const pageNameSnap = await admin.database().ref('/books/'+`${category}`+'/pages/'+`${page}`+'/name/').once('value');
const pageName = pageNameSnap.val();
// ...
});
请注意,该函数已设为异步(以允许等待 .once('value')
返回的 promise ,并从结果快照中提取值。
These docs了解有关从实时数据库检索数据的更多信息。
关于javascript - 如何从特定的实时数据库路径查询值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60760359/