【问题标题】:Google Cloud Functions - nodejs6 cloud function not working in nodejs8(beta)Google Cloud Functions - nodejs6 云功能在 nodejs8(测试版)中不起作用
【发布时间】:2019-07-09 21:17:27
【问题描述】:

我的代码在 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 处于测试阶段。最终它将来到GA。如何解决这个问题。

【问题讨论】:

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


    【解决方案1】:

    下面的评论显示了这个问题是如何解决的。

    【讨论】:

    • 我的错,我认为升级 nodejs 很容易,只需添加 --runtime nodejs8 标志。我没有check the sample programs in link。看来我也必须做一些其他的改变。按照上述链接更新程序后,它可以工作了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 2019-05-10
    • 2020-02-20
    • 1970-01-01
    • 2013-05-29
    • 2017-06-27
    相关资源
    最近更新 更多