2017-09-15 8 views
1

我发现很奇怪的是,当我把它放在一个.html和检查控制台日志一切看起来罚款执行相同的代码,但是当我把完全相同的代码块没有云功能中执行并因某种原因被跳过。我需要做的就是从配置对象中获取一些配置参数并根据需要使用它们。Firebase .on('value')代码块在云端功能中不执行。任何建议要解决?

var db = admin.database().ref(); 
    var configRef = db.child("config"); 

    configRef.on('value', function(snap){ 
    var snapvalue = snap.val(); 
    var totalLength = Object.keys(snapvalue).length; 
     $.each(snapvalue, function(key, value) { 
     console.log(value,key); 
    }); 
    }); 

完成云功能如下:

exports.myFunction = functions.database.ref('/object/{list}').onWrite(event =>{ 

    console.log("Inside myFunction..."); 

    var db = admin.database().ref(); 
    var configRef = db.child("config"); 

    configRef.on('value', function(snap){ 
     var snapvalue = snap.val(); 
     $.each(snapvalue, function(key, value) { 
      console.log(value,key); 
     }); 
    }); 

    console.log("Leaving myFunction..."); 

}) 

我之前和之后on('value')块,功能执行但没有on('value')代码块获取控制台日志。

+0

您是否愿意共享您部署的整个功能?你怎么触发它? –

+0

云功能executing..l所有代码之前和之后对(“值”)代码块执行罚款..所以我不认为部署是一个问题..但也许我失去了一些东西或者不这样做是正确的...这里是全功能... '' –

+0

能否请您展示全功能? 。 –

回答

1

随着云功能,你需要return a promise(注意,示例代码中的注释)当所有的异步工作在函数完成解析。 once()以异步方式执行并返回承诺,因此您应该返回其承诺,以便Cloud Functions知道何时需要清理。

而且,它可能更容易使用,然后()来继续你的工作时,数据是可用的。

exports.myFunction = functions.database.ref('/object/{list}').onWrite(event => { 

    console.log("Inside myFunction..."); 

    var db = admin.database().ref(); 
    var configRef = db.child("config"); 

    return configRef.once('value').then(snap => { 
     var snapvalue = snap.val(); 
     $.each(snapvalue, function(key, value) { 
      console.log(value,key); 
     }); 
    }); 
}) 

如果您要使用云功能,您还必须了解如何使用承诺。

+0

它应该是一次()做一个单一的查询。您无法无限期地使用云端功能进行聆听。 –

+0

谢谢,道格!有效。至少,它进入了代码块。不过,有点好奇,我们可以用.on来做吗?另外..我得到了以上代码的错误:'ReferenceError:$没有在configRef.once.then.snap'定义' –

+0

好吧,有你了!澄清是有道理的。 –