这似乎应该是绝对幼儿园水平简单,但我是一个完全初学者的Firebase/FCM/node.js,并没有找到一个教程或堆栈解释了这一点。这里可能会使用错误的术语,所以请原谅我!
我做了一个简单的Firebase函数,在我的Firebase实时数据库中触发对movecarday
的更改通知。我使用change.after.val()
将更新后的数据作为文本包含在通知的标题字段中。那部分很好用。
但是,我希望引用来自该数据库(movecartime
)中不同节点的第二段数据,并将其包含在消息正文中。数据在Firebase中是这样设置的(非常简单):
{
"movecarday" : "Monday",
"movecartime" : "9:30",
}
下面是我目前在index.js中为触发器函数使用的代码。
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.pushNotification = functions.database.ref('/movecarday/{day}').onWrite((change, context) => {
console.log('Push notification event triggered');
const valueObject = change.after.val();
var thisistheday = valueObject;
var timeref = firebase.database().ref("/movecartime/{time}");
timeref.on("value", function(snapshot) {
var thisisthetime = snapshot.val();
});
const payload = {
notification: {
title: `The car is parked in a ${thisistheday} spot!`,
body: `Must be moved by ${thisisthetime}`,
sound: "default"
}
};
const options = {
priority: "high",
timeToLive: 60 * 60 * 24
};
return admin.messaging().sendToTopic("pushNotifications", payload, options);
});
希望您能看到的是,movecarday
onWrite正在触发通知,并且change.after.val()
被设置为var并放置在标题字符串中。这部分工作得很完美!但是,我也试图获得movecartime
的值,以便将其放置在主体字符串中。这里的代码只是我在各种教程、文档和堆栈的基础上尝试过的许多管道式的变体之一,它们使用快照从movecartime
获取数据并将其转换为var。但是,我尝试过的每一个变体要么在部署级别上失败,要么阻止通知被完全发送。
对于这段代码的快照/movecartime部分,我做错了什么?在FCM触发器函数中,这甚至是可能的吗?它看起来应该是绝对基本的,但我只是遗漏了一些东西。
谢谢。
发布于 2020-12-23 08:36:36
你这里出了很多问题。请仔细阅读。
首先,不要对像这样的查询使用on()
。on()
为数据添加了一个持久侦听器,并在数据更改时反复调用callbck,直到删除为止。这根本不是你想要的。相反,使用一次性()查询一次。它返回查询位置的数据快照即可实现的承诺。你需要利用这个承诺来获取数据。
其次,这不会将time
的值放在字符串中:
var timeref = firebase.database().ref("/movecartime/{time}");
在JavaScript中,这实际上是试图查询一个名为"/movecartime/{time}“的数据库节点。相反,您需要使用回勾引号将变量的值插入字符串中:
var timeref = firebase.database().ref(`/movecartime/${time}`);
第三,似乎您的函数代码是无效的,因为我们不知道您是如何发送消息的。但是您在代码中没有正确地处理承诺。您的函数将需要返回在发送通知后解决的承诺。
云函数并不是学习JavaScript最容易的地方。在浏览器中更容易学习。但是如果你必须学习云函数,你应该自由地使用日志来理解你的代码是如何运行的。
https://stackoverflow.com/questions/65427647
复制