【问题标题】:Cloud Functions for Firebase getting value of keyCloud Functions for Firebase 获取键值
【发布时间】:2017-08-09 15:45:15
【问题描述】:

我正在尝试从作者那里获取值,但它说它是未定义的。

如何在 Cloud Functions for Firebase 中从 javascript 中的 firebase 获取特定子项的值,以下代码应该可以工作(?):

const functions = require('firebase-functions');                                          

const admin = require('firebase-admin');                                                  

admin.initializeApp(functions.config().firebase);                                         

exports.sendPushForHelp =                                                                 
functions.database.ref('/schools/Vittra/alarms/active/{id}').onCreate(event => {      
    const id = event.params.id;                                                       
    var eventSnapshot = event.data.val();                                             
    var ref = admin.database().ref("/schools/Vittra/alarms/{eventSnapshot}/authorId");
    ref.once('value').then(function(snapshot) {                                       
        var author = snapshot.val();                                                  
    });                                                                               






    const payLoad = {                                                                 
        notification: {                                                               
            title: String(eventSnapshot),                                             
            body: String(author),                                                     
            badge: '1',                                                               
            sound: 'Intruder.mp3'                                                     
        }                                                                             
    };                                                                                

return admin.database().ref('fcmToken').once('value').then(allToken => {                  
        if (allToken.val()) {                                                             
     const token = Object.keys(allToken.val());                                            
     return admin.messaging().sendToDevice(token, payLoad).then(response => 
{              

           });                                                                           

        };                                                                                
    });                                                                                   

});

【问题讨论】:

  • 如果你添加你的数据库的图像,并告诉我你想要什么,我可以看看

标签: javascript firebase firebase-realtime-database firebase-cloud-messaging google-cloud-functions


【解决方案1】:

您忽略了从此查询返回的承诺:

ref.once('value').then(function(snapshot) {                                       
    var author = snapshot.val();                                                  
});                                                                               

在您可以使用author 的值之前,您需要将依赖于author 的代码响应该承诺的函数中,更像这样:

var author;

return ref.once('value').then(function(snapshot) {                                       
    author = snapshot.val();
    return admin.database().ref('fcmToken').once('value')
}).then(function(snapshot) {
    if (allToken.val()) {                                                             
        const token = Object.keys(allToken.val());                                            
        const payLoad = ...
        return admin.messaging().sendToDevice(token, payLoad)
    }
}).then(function(response) {
    // ...continue
})

最重要的是,您需要学习如何正确链接您的承诺。

【讨论】:

  • 感谢您的帮助我是 javascript 新手(仅用于 swift)。当我按照您建议的方式进行操作时,我收到未定义有效负载的错误。
  • 我稍微编辑了代码以在需要之前定义有效负载。
【解决方案2】:

您已在 firebase 回调中声明 author

    var eventSnapshot = event.data.val();                                             
    var ref = admin.database().ref("/schools/Vittra/alarms/{eventSnapshot}/authorId");
    ref.once('value').then(function(snapshot) {                                       
        var author = snapshot.val();  // Here is the problem                                                
    }); 

你在这里使用它:

const payLoad = {                                                                 
        notification: {                                                               
            title: String(eventSnapshot),                                             
            body: String(author), // <------                                                    
            badge: '1',                                                               
            sound: 'Intruder.mp3'                                                     
        }                                                                             
    }; 

在 eventSnapshot 之外定义作者,然后你可以进一步使用它。

用途:

        var eventSnapshot = event.data.val();  
        var author = '';           
        var ref = admin.database().ref("/schools/Vittra/alarms/{eventSnapshot}/authorId");
        ref.once('value').then(function(snapshot) {                                       
            author = snapshot.val();                                                
        }); 

【讨论】:

    猜你喜欢
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 2017-09-07
    • 2018-01-03
    相关资源
    最近更新 更多