2017-04-24 115 views
12

名称空间的的Firebase文档显示该函数接受express.Request对象和express.Response对象。它没有提到你可以将一个快速服务器对象传递给functions.https.onRequest。然而,我发现,人们已经从评论者没有明确的迹象表明这不应该做的(除了一个人在functions-samples回购问题#101线程)这样用于Firebase和Express的云功能

见:

我的问题是,那么:

  1. Firebase或GCP云功能的云端函数如何处理在函数定义之外初始化的对象的生命周期?
  2. 上面是如何影响函数的生命周期的?它是否运行到超时或功能类似于AWS Lambda?

澄清1 & 2:在LAMBDA导出的函数之外的任何资源时在相同的LAMBDA实例的所有后续调用使用,而功能实例是“暖”。这意味着函数的响应时间不会受到任何复杂的初始化代码的负面影响,因为它是每个“热”实例完成的。在这个例子中,它不需要每次调用初始化一个ExpressJS服务器,只需要一次,而该函数是“温暖”的。我很好奇云功能是否也一样?

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

  1. functions.https.onRequest文档未指定您可以将ExpressJS服务器对象传递给它,那么这是如何工作的?那么是否有两个端点?有人可以解释这里发生了什么吗?

澄清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);

,并希望知道这个作品是如何提供的云功能API只指定接受functions.https.onRequest(request, response) PARAMS模仿ExpressJS API。

这些参数是基于快速Request和Response对象 - firebase.google.com/docs/functions/http-events

由于所有的问题涉及到代码的单一片段,这一次用例我认为它会更好地回答在一起。

感谢提前:)

+0

请注意,使用中间件会在[文档](https://firebase.google.com/docs/functions/http-events#use_middleware_modules_with_cloud_functions)和[函数示例中](https:// github。 COM /火力/函数的样品)。 – Kato

+0

您的声明“API仅指定在ExpressJS API之后建模的接受functions.https.onRequest(请求,响应)参数。”并不完全准确。从Firebase云端函数文档中,它们实际上传递了一个函数(箭头函数),而不仅仅是请求和响应参数。 –

回答

14

这一切都有效,因为在封面下,一个Express应用程序实际上只是一个接受Node.js HTTP请求和响应并使用一些自动加糖(比如路由)对其执行操作的函数。因此,您可以将Express路由器或应用程序传递到云端功能处理程序,因为Express的reqres对象与标准Node.js版本兼容。基本上,这是一个“双快速”应用程序,其中一个应用程序调用另一个。

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

您可以在函数调用之外创建资源(例如Express应用程序),并在计算资源为该函数启动时执行。只要这种情况发生,它就会存活下去;但是,CPU /网络在调用之间被限制为有效零,因此您不能在函数调用的生命周期外执行任何“工作”。一旦承诺解决(或者您已经响应HTTP请求),您的计算资源通过节流被限制,并且可能在任何时候终止

+2

感谢您的回复。只是后续问题:假设所有函数都是通过相同的index.js文件导出的,那么每个函数都会创建函数定义之外的任何资源? – jthegedus

+2

是的,每个函数都会在自己的计算基础结构中分别执行函数定义之外的代码。 –

3

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

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

+0

感谢您的回复,我已更新该帖子以澄清一些要点,以避免此处漫长的讨论。 – jthegedus

+0

我很乐意将它分成多个问题,但如果您仍然认为这会导致更容易发现的问题和解答 – jthegedus

+0

在更一般的讨论中,您可能会说“你不应该依赖”共享状态。因为为了清楚起见,如果变量定义在错误的级别并且没有正确地重新初始化,可能会意外地共享状态(这可能导致错误)。还有一种有用的模式,用于维护诸如数据库连接之类的“温暖”容器,通过故意这样做...... –