适用于Firebase和Express的云功能

时间:2017-04-24 03:42:22

标签: express firebase google-cloud-functions

functions.https命名空间的Firebase文档显示该函数接受express.Request对象和express.Response对象。它没有提到您可以将快速服务器对象传递给functions.https.onRequest。但是,我发现人们一直这样做,而且评论者没有明确指出这不应该做(除了functions-samples回购问题#101线程中的一个人)

请参阅:

我的问题是:

  1. Firebase或GCP云功能的云功能如何处理在功能定义之外初始化的对象的生命周期?
  2. 以上内容如何影响功能的生命周期?它是否会运行到超时或与AWS Lambda类似的功能?
  3. 澄清1& 2:在Lambda中,导出函数之外的任何资源都用于同一Lambda实例的所有后续调用,而该函数实例为“暖”。这意味着函数的响应时间不会受到任何复杂初始化代码的负面影响,因为每个“热”实例都会执行一次。在这个例子中,它不需要在每次调用时初始化一个ExpressJS服务器,只需要在函数“暖”时初始化一次。我很好奇Cloud Functions是否也这样做了?

    同样在Lambda中,ExpressJS服务器的存在不会延长函数的执行时间(当它返回完成时),我也很好奇云功能是如何在这里实现的。它是否与Lambda完全相同,或者(因为它可能以不同方式处理现有对象)它是否会执行其他操作?

    1. functions.https.onRequest文档未指定您可以将ExpressJS服务器对象传递给它,那么这是如何工作的?那么有两个端点吗?有人能解释一下这里发生了什么吗?
    2. 澄清3:我一直看到人们做以下事情:

      // './functions/index.js'
      
      var functions = require("firebase-functions");
      const express = require("express");
      
      // setup ExpressJS Server
      const expressRouter = new express.Router();
      expressRouter.get("*", (req, res) => {
        res.send(`Hello from Express in Cloud Functions for Firebase`);
      });
      
      // Cloud Function
      exports.express = functions.https.onRequest(expressRouter);

      并且希望知道这是如何工作的,因为Cloud Functions API仅指定接受在ExpressJS API之后建模的functions.https.onRequest(request, response)参数。

        

      这些参数基于Express请求和响应对象 - firebase.google.com/docs/functions/http-events

      由于所有问题都与单个代码片段以及这个用例有关,我认为它可以更好地一起回答。

      提前致谢:)

2 个答案:

答案 0 :(得分:25)

这一切都有效,因为在幕后,Express应用程序实际上只是一个接收Node.js HTTP请求和响应的函数,并通过一些自动加糖(如路由)对它们进行操作。因此,您可以快速将Express路由器或应用程序传递给Cloud Function处理程序,因为Express的reqres对象与标准Node.js版本兼容。基本上,它是一个“双快递”应用程序,其中一个应用程序呼叫另一个。

就功能生命周期和共享状态而言:函数在短暂的计算实例中生成,可能生存以处理多个请求,但可能不会。你不能调整或保证在同一个计算实例中从一次调用到下一次调用是否会调用一个函数。

您可以在函数调用之外创建资源(例如Express应用程序),并在为该函数调度计算资源时执行该资源。只要实例存在,这将存在;但是,CPU /网络在调用之间被限制为有效为零,因此您不能在函数调用的生命周期之外执行任何“工作”。一旦承诺解决(或您已响应HTTP请求),您的计算资源通过限制来限制,并且可能随时终止。

答案 1 :(得分:4)

您不应期望在功能的生命周期内保留任何资源。在功能的最终承诺已解决或HTTP响应已完全发送后,您应该期望容器将完全清理。任何函数调用之间都没有共享状态。这是云功能可以扩展的唯一方式。如果您需要共享状态,请将其存储在数据库中并在每次调用时读取它,并在必要时使用事务保护它。

我不确定你在第三个问题中提到了什么。这看起来与前两个问题无关 - 也许应该是它自己的问题?据我所知,你的后端只有一个端点。