Firebase Cloud功能onCreate造成痛苦的缓慢更新数据库

时间:2019-08-21 18:35:40

标签: javascript firebase google-cloud-firestore google-cloud-functions

我遇到了一个有点奇怪的问题,由于没有错误,我不确定自己做错了什么。我要执行的操作是在一个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;
});

Screenshot showing 2 minutes to update

1 个答案:

答案 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;
    }

});