云功能-返回之前状态为“ ok”的功能执行完成

时间:2019-01-02 04:48:54

标签: google-cloud-functions async.js

我有一个(GCP)云功能,用于汇总每小时数据并写入Cloud Bigtable,但是在返回完整的消息之前,它似乎返回了一条消息:“函数执行耗时100ms,状态为ok”代码,随后的行有时会运行,有时却不会。如果有人有任何经验并可以就此提供建议,那就太好了!

当我运行脚本时,它仅在Cloud Functions中可在我的本地计算机上运行,​​我不确定是什么触发了代码的终止。我尝试添加一个try / catch块,但是它也没有引发任何错误。该代码的主要部分复制如下:

const Bigtable = require('@google-cloud/bigtable');
const bigtableOptions = { projectId: process.env.PROJECT_ID };
const bigtable = new Bigtable(bigtableOptions);
const cbt = bigtable.instance(process.env.BIGTABLE_INSTANCE);
const async = require("async");
const moment = require("moment");
require("moment-round");
const bigtableFetchRawDataForDmac = require("./fetchData").bigtableFetchRawDataForDmac;

exports.patchJob = (event, context) => {
    const pubsubMsg = Buffer.from(event.data, 'base64').toString();
    const jsonMsg = tryParseJSON(pubsubMsg);    // msg in format { time: "2018-12-24T02:00:00.000Z", dmac: ["abc", "def", "ghi] }
    if(!jsonMsg) return;
    else {
        if(!jsonMsg.time) { 
            console.log("Time not provided");
            // res.status(400).json({ err: 'TimeNotProvided', msg: `Time parameter is not provided` });
            return;
        }
        let date_range = {};
        date_range.lower = moment(jsonMsg.time).toISOString();
        date_range.upper = moment(jsonMsg.time).add(1,'hours').subtract(1,"milliseconds").toISOString();

        let queryData = [];
        let data = {};
        for(let i=0; i<jsonMsg.dmac.length; i++){
            data[jsonMsg.dmac[i]]=[];
            queryData.push(bigtableFetchRawDataForDmac(cbt, jsonMsg.dmac[i], date_range.lower, date_range.upper, data[jsonMsg.dmac[i]]));
        }
        async.parallel(queryData, function(err, result){
            console.log("cookie trail...");
            return;
        }   
    }
}

对于bigtableFetchRawDataForDmac,它位于另一个文件夹中:

function bigtableFetchRawDataForDmac(cbt, dmac, start, end, data) {
    return async function(cb){
        const table = cbt.table(process.env.BT_DATA_TABLE);
        try { var bigtable = await fetchFromBigtable(table, process.env.BT_DATA_TABLE, dmac, start, end, data, ['push', 'mode', 'val']); }
        catch (err) { console.log("bigtableFetchRawDataForDmac failed: ", err); cb(err); }
    }
}

2 个答案:

答案 0 :(得分:1)

pubsub Cloud Function接收一个eventcallback参数。完成所有工作后,您应该将回调方法调用到terminate the function,所有类型的background Cloud Functions都是这种情况。

您已调用回调context。而且您根本没有使用它来终止功能。您也可以返回一个诺言,当所有工作完成后,诺言便会解决,但是您也不这样做。

您将不得不找出一种方法,仅在所有异步工作完成后才能正确终止函数,否则它将无法按您期望的方式工作。

答案 1 :(得分:0)

在Nodejs 8(Beta)运行时中,应提供3个参数(数据,上下文,回调),而不是Cloud Functions控制台的内联编辑器中默认模板中提供的2个参数。 (文档参考: https://cloud.google.com/functions/docs/writing/background#functions_background_parameters-node8)。

代码应类似于:

exports.patchJob = (event, context, callback) => {
    doSomething();
    callback(); // To terminate Cloud Functions
}

感谢@Doug的提示!