Облачные функции - выполнение функции завершено со статусом «ОК» перед возвратом - PullRequest
0 голосов
/ 02 января 2019

У меня есть облачная функция (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;
        }   
    }
}

Для 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 голосов
/ 02 января 2019

В среде исполнения Nodejs 8 (Beta) необходимо указать 3 параметра (данные, контекст, обратный вызов) вместо 2, как указано в шаблоне по умолчанию во встроенном редакторе консоли Cloud Functions.(Ссылка на документацию: https://cloud.google.com/functions/docs/writing/background#functions_background_parameters-node8).

Код должен выглядеть примерно так:

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

Спасибо @Doug за подсказку!

0 голосов
/ 02 января 2019

A Pubsub Cloud Function получает параметры event и callback.Вы должны вызывать метод обратного вызова, чтобы завершать функцию , когда вся работа завершена, как это имеет место для всех типов фоновых облачных функций .

Вы позвонили по телефону context.И вы не используете его для завершения функции вообще.В качестве альтернативы вы можете вернуть обещание, которое разрешается, когда вся работа завершена, но вы тоже этого не делаете.

Вам нужно будет найти способ правильно завершить свою функцию только после того, как всеАсинхронная работа завершена, или она не будет работать так, как вы ожидаете.

...