我遇到了一个有点奇怪的问题,由于没有错误,我不确定自己做错了什么。我要执行的操作是在一个onCreate
事件上,进行API调用,然后如果该字段未设置为null
,则更新数据库上的一个字段。根据有关云功能的控制台日志,我可以看到API调用得到了ok
,并且一切正常,但是大约2-5分钟后,它将更新。几次,它没有更新15分钟后。是什么原因导致更新缓慢?
我仅从函数日志和本地测试中就消除了gaxios
调用的瓶颈。
某些情况:我正在火力四射的计划中允许出口,而我的数据集并不是很大。我正在使用gaxios
,因为它已经是firebase-funcstions npm安装的一部分。
代码是:
const functions = require('firebase-functions');
const { request } = require('gaxios');
const { parse } = require('url');
exports.getGithubReadme = functions.firestore.document('readmes/{name}').onCreate((snapshot, context) => {
const toolName = context.params.name;
console.log(toolName);
const { name, description, site } = snapshot.data();
console.log(name, description, site);
const parsedUrl = parse(site);
console.log(parsedUrl);
if (description) return;
if (parsedUrl.hostname === 'github.com') {
let githubUrl = `https://api.github.com/repos${parsedUrl.path}/readme`;
request({
method : 'GET',
url : githubUrl
})
.then((res) => {
let { content } = res.data;
return snapshot.ref.update({ description: content });
})
.catch((error) => {
console.log(error);
return null;
});
}
return null;
});
答案 0 :(得分:1)
在后台触发的Cloud Function中执行异步操作(例如request()
)时,您必须返回一个诺言,以这种方式Cloud Function等待答应解决以终止。
此处的官方Firebase视频系列(Learning Cloud Functions for Firebase (video series))中对此进行了很好的解释。尤其要观看三个名为“学习JavaScript的承诺”的视频(第2和第3部分特别关注后台触发的Cloud Functions,但之前确实值得观看第1部分)。
因此,您应该按以下方式修改代码,返回request()
返回的promise:
const functions = require('firebase-functions');
const { request } = require('gaxios');
const { parse } = require('url');
exports.getGithubReadme = functions.firestore.document('readmes/{name}').onCreate((snapshot, context) => {
const toolName = context.params.name;
console.log(toolName);
const { name, description, site } = snapshot.data();
console.log(name, description, site);
const parsedUrl = parse(site);
console.log(parsedUrl);
if (description) return null;
if (parsedUrl.hostname === 'github.com') {
let githubUrl = `https://api.github.com/repos${parsedUrl.path}/readme`;
return request({
method: 'GET',
url: githubUrl
})
.then((res) => {
let { content } = res.data;
return snapshot.ref.update({ description: content });
})
.catch((error) => {
console.log(error);
return null;
});
} else {
return null;
}
});