Google Cloud Functions-nodejs6云功能在nodejs8(beta)中不起作用

时间:2019-02-15 17:25:09

标签: firebase-realtime-database google-cloud-platform google-cloud-functions google-cloud-pubsub nodejs-8.11

我的代码在nodejs6中成功运行。我只是想将其部署在nodejs8中。

index.js包含以下代码

// [START functions bgMCMA]
/**
 * Background Cloud Function - Triggered by PubSub.
 * @param {!Object} event The Cloud Functions event.
 * @param {!Function} The callback function.
 */
exports.bgScrapeMCMA = (event, callback) => {

    //Logic to avoid infinite loop on timeout
    const eventAge = Date.now() - Date.parse(event.timestamp);
    const eventMaxAge = 420000; //7Minutes as timeout is set as 504 seconds(9Minutes)

    // Ignore events that are too old
    if (eventAge > eventMaxAge) {
      console.log(`INFINITE-LOOP-BREAK : Dropping context ${context} with age ${eventAge} ms.`);
      callback(); // Don't forget to call the callback. Remember its either a callback() or promise
      return;
    }    

    // The Cloud Pub/Sub Message object.
    const pubSubMessage = event.data;
    const message = pubSubMessage.data ? Buffer.from(pubSubMessage.data, 'base64').toString() : 'NONE';

    console.log('MCMA triggered time : ' + DateTime.getCurrentISTdt("yyyy-mmm-dd hh:mm:ss") + ' Message : ' + message);

    MCMA.start().then( (resp) =>{
        console.log('MCMA : Success : '+resp);
        callback(); // Don't forget to call the callback. Remember its either a callback() or promise        
    }).catch( (e) =>{
        console.error('MCMA : Error : '+e);
        callback(); // Don't forget to call the callback. Remember its either a callback() or promise
    });

};
// [END functions bgMCMA]

使用以下命令部署到nodejs8

gcloud functions deploy bgScrapeMCMA --trigger-resource psTriggerbgScrapeMCMA --trigger-event google.pubsub.topic.publish --entry-point=bgScrapeMCMA --timeout=540s --runtime nodejs8

功能已成功部署。

我正在通过pubsub触发代码。在功能控制台中,我将单击该主题,然后在消息文本区域中发布“ TEST”之类的消息。

期望是什么?
在检查日志时,通常会显示消息“ TEST”。因此,我可以理解功能已成功触发。

在nodejs8中部署后,我看到了什么?

  1. 在pubsub中输入消息“ TEST”后。在日志中,我看到的消息是“ NONE”。所以我的理解是函数触发了它,但没有得到我的消息。

  2. 函数执行大约45秒后。它因消息textPayload而崩溃:“错误:函数崩溃超出了请求范围 函数调用被中断。”

  3. 当我重新运行时,这次由于内存textPayload而崩溃:“错误:内存限制已超出。函数调用被中断。”

自从第二次由于内存崩溃以来,当前使用的内存为256MB。所以我编辑功能并将其增加到512MB。第一个错误再次出现,“错误:函数崩溃超出了请求范围  函数调用被中断。”

在这一点上,我怀疑我以前运行的程序只是为了升级到nodejs8。我删除了以前的工作功能,并尝试使用新的节点版本进行部署。所以我回去重新部署了nodejs6和256MB内存。当我执行功能时。

该功能的主要作用是刮取网站并更新Firebase。经过的功能大约在10s-45s之间。

所以我基本上想知道的两件事是,GCP的NodeJS8中发生了什么变化。 1.来自pubsub的简单消息未出现在日志中

const pubSubMessage = event.data;
const message = pubSubMessage.data ? Buffer.from(pubSubMessage.data, 'base64').toString() : 'NONE';

console.log('MCMA triggered time : ' + DateTime.getCurrentISTdt("yyyy-mmm-dd hh:mm:ss") + ' Message : ' + message);
  1. 占用大量内存。 256MB可用的nodejs6甚至崩溃了512MB。

我知道nodejs8是beta版。最终它将进入通用航空。如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

下面的评论显示了如何解决此问题。