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)
pubsub Cloud Function接收eventandcallback参数。当所有工作完成时,您应该调用回调方法来终止函数,就像所有类型的后台 Cloud Functions的情况一样。
您已调用回调context。而且您根本没有使用它来终止该函数。您也可以返回一个在所有工作完成后解决的承诺,但您也没有这样做。
只有在所有异步工作完成后,您才必须找到一种方法来正确终止函数,否则它将无法按您期望的方式工作。
| 归档时间: |
|
| 查看次数: |
2135 次 |
| 最近记录: |