云函数 - 返回前函数执行已完成,状态为“ok”

jly*_*lyh 1 async.js google-cloud-functions

我有一个(GCP)云函数,旨在聚合每小时数据并写入 Cloud Bigtable,但它似乎返回消息:“函数执行花费了 100 毫秒,完成状态:正常”,然后完成完整代码,随后线路有时运行,有时不运行。如果有人有这方面的经验并能提供建议,那就太好了,谢谢!

当我运行脚本时,它在我的本地计算机上运行,​​仅在云函数中运行,并且我不确定是什么触发了代码的终止。我尝试添加 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;
        }   
    }
}
Run Code Online (Sandbox Code Playgroud)

对于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); }
    }
}
Run Code Online (Sandbox Code Playgroud)

Dou*_*son 5

pubsub Cloud Function接收eventandcallback参数。当所有工作完成时,您应该调用回调方法来终止函数,就像所有类型的后台 Cloud Functions的情况一样。

您已调用回调context。而且您根本没有使用它来终止该函数。您也可以返回一个在所有工作完成后解决的承诺,但您也没有这样做。

只有在所有异步工作完成后,您才必须找到一种方法来正确终止函数,否则它将无法按您期望的方式工作。