首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在云消息传递触发函数中引用Firebase实时数据(在标题或正文中使用)

如何在云消息传递触发函数中引用Firebase实时数据(在标题或正文中使用)
EN

Stack Overflow用户
提问于 2020-12-23 16:30:03
回答 1查看 38关注 0票数 1

这似乎应该是绝对幼儿园水平简单,但我是一个完全初学者的Firebase/FCM/node.js,并没有找到一个教程或堆栈解释了这一点。这里可能会使用错误的术语,所以请原谅我!

我做了一个简单的Firebase函数,在我的Firebase实时数据库中触发对movecarday的更改通知。我使用change.after.val()将更新后的数据作为文本包含在通知的标题字段中。那部分很好用。

但是,我希望引用来自该数据库(movecartime)中不同节点的第二段数据,并将其包含在消息正文中。数据在Firebase中是这样设置的(非常简单):

代码语言:javascript
代码运行次数:0
运行
复制
   {
  "movecarday" : "Monday",
  "movecartime" : "9:30",
}

下面是我目前在index.js中为触发器函数使用的代码。

代码语言:javascript
代码运行次数:0
运行
复制
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触发器函数中,这甚至是可能的吗?它看起来应该是绝对基本的,但我只是遗漏了一些东西。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-12-23 16:36:36

你这里出了很多问题。请仔细阅读。

首先,不要对像这样的查询使用on()on()为数据添加了一个持久侦听器,并在数据更改时反复调用callbck,直到删除为止。这根本不是你想要的。相反,使用一次性()查询一次。它返回查询位置的数据快照即可实现的承诺。你需要利用这个承诺来获取数据。

其次,这不会将time的值放在字符串中:

代码语言:javascript
代码运行次数:0
运行
复制
var timeref = firebase.database().ref("/movecartime/{time}");

在JavaScript中,这实际上是试图查询一个名为"/movecartime/{time}“的数据库节点。相反,您需要使用回勾引号将变量的值插入字符串中:

代码语言:javascript
代码运行次数:0
运行
复制
var timeref = firebase.database().ref(`/movecartime/${time}`);

第三,似乎您的函数代码是无效的,因为我们不知道您是如何发送消息的。但是您在代码中没有正确地处理承诺。您的函数将需要返回在发送通知后解决的承诺。

云函数并不是学习JavaScript最容易的地方。在浏览器中更容易学习。但是如果你必须学习云函数,你应该自由地使用日志来理解你的代码是如何运行的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65427647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档