Firebase .on('value')代码块不在内部执行云function。 任何build议要解决?

我发现它真的很奇怪,当我把它放在一个.html文件中时,它会执行相同的代码,并检查控制台日志是否正常,但是当我将完全相同的代码块放入一个不执行的云function中由于某种原因正在被跳过。 我需要做的是从configuration对象获取一些configuration参数,并根据需要使用它们。

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); }); }); 

完成的云function如下所示:

 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')块所以function正在执行,但不是on('value')代码块。

使用云function,您需要返回一个承诺 (请注意代码示例中的注释),以解决在函数中完成所有asynchronous工作时的情况。 once()以asynchronous方式执行并返回一个promise,所以您应该返回它的承诺,以便Cloud Functions知道何时清理。

另外,当数据可用时,使用then()可能会更容易继续工作。

 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); }); }); }) 

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