Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase:从云函数调用云函数_Javascript_Node.js_Firebase_Firebase Realtime Database_Google Cloud Functions - Fatal编程技术网

Javascript Firebase:从云函数调用云函数

Javascript Firebase:从云函数调用云函数,javascript,node.js,firebase,firebase-realtime-database,google-cloud-functions,Javascript,Node.js,Firebase,Firebase Realtime Database,Google Cloud Functions,我遇到了Firebase云功能的一个问题。我有一个onWrite云函数,可以触发一系列事件。我有一个onWrite云函数绑定的请求路径。当该云函数执行时,它删除请求路径的新请求,并将该请求推送到渲染路径/que中,该渲染路径/que将用于客户端渲染UI元素/数据。将数据写入渲染路径后,我将调用一个与任何云事件无关的普通javascript函数。vanilla javascript函数应该能够访问外部API并获取一些数据,以便稍后在推送到渲染路径的渲染对象上进行更新 问题是普通javascript

我遇到了Firebase云功能的一个问题。我有一个onWrite云函数,可以触发一系列事件。我有一个onWrite云函数绑定的请求路径。当该云函数执行时,它删除请求路径的新请求,并将该请求推送到渲染路径/que中,该渲染路径/que将用于客户端渲染UI元素/数据。将数据写入渲染路径后,我将调用一个与任何云事件无关的普通javascript函数。vanilla javascript函数应该能够访问外部API并获取一些数据,以便稍后在推送到渲染路径的渲染对象上进行更新

问题是普通javascript函数永远不会执行。我一直在网上寻找原因,但似乎找不出原因。我在Flame计划中,因此据我所知,应该允许出站api请求。下面是我的代码示例:

const functions=require('firebase-functions');
const admin=require('firebase-admin');
const request=require('request');
admin.initializeApp();
exports.requestModule=functions.database.ref('/requests').onWrite((更改,上下文)=>{
//创建对数据库的引用
设db=admin.database();
if(context&&context.auth&&context.auth.uid){
const afterData=change.after.val();
让uid=context.auth.uid;
让cleanData=afterData[uid];
cleanData.status=“正在加载”;
//从请求路径中删除请求的模块
让cleansePath=db.ref('/requests/'+uid);
cleansePath.remove()。然后((快照)=>{
返回true;
}).catch((错误)=>{
console.log(错误);
返回false;
});
//将请求的模块添加到渲染路径
让renderPath=db.ref('/render/'+uid);
renderPath.push(cleanData).then((快照)=>{
设val=snapshot.val();
让key=snapshot.key;
//触发GetWeatherAPI调用
getWeather(uid、key、val);
返回true;
}).catch((错误)=>{
console.log(错误);
返回false;
});
}
});
//从外部api获取数据
函数getWeather(uid、key、obj){
console.log('Fetching weather!');
设db=admin.database();
请求('https://api.someweathersite.net/forecast/“,(错误、响应、正文)=>{
如果(!error&&Number(response.statusCode)==200){
console.log('error:',error);
console.log('statusCode:',response&&response.statusCode);
log('body:',body);
obj.data=主体;
obj.status=‘已加载’;
//将渲染对象中api响应中的数据设置为显示在客户端
让render=db.ref('/render/'+uid+'/'+key);
render.set(obj).then(()=>{
返回true;
}).catch((错误)=>{
console.log(错误)
返回false;
});
}
});

}
getWeather
正在执行异步工作以获取一些数据,但它没有返回指示该工作何时完成的承诺。事实上,这里执行的异步工作都没有正确使用各种API调用返回的承诺。仅仅在每个承诺上使用
then()
是不够的

您需要跟踪异步工作的所有,并返回一个只有在所有工作完成后才能解析的承诺。否则,云函数可能会在工作完成之前终止并清理您的函数。(请注意,在强制终止之前,哪些工作可能会或可能不会真正完成并不确定,但确保所有工作完成的唯一方法是通过您返回的单个承诺。)


您可能想看我的教程,了解如何在云函数中使用Promissions,以便更好地掌握如何使函数正常工作:

谢谢Doug!非常感谢。现在就看这个视频系列。对我来说有道理。