云函数-如何仅实例化全局函数/变量一次?

时间:2019-03-09 17:23:52

标签: javascript firebase google-cloud-platform google-cloud-functions

我有一个Firebase应用程序,该应用程序使用Cloud Functions与Google Cloud SQL实例进行对话。这些云功能用于执行CRUD操作。我想确保数据库反映出CRUD操作,因此,每次我推送新功能代码时都要运行迁移代码,以确保数据库始终是最新的。

我在全局函数中执行此操作

const functions = require('firebase-functions')
const pg = require('pg')    

// Create if not exists database
(function() {
    console.log('create db...')
})()

exports.helloWorld = functions.https.onRequest((request, response) => {
    console.log('Hello from Firebase function log!')
    response.send('Hello from Firebase!')
})

exports.helloWorld2 = functions.https.onRequest((request, response) => {
    console.log('Hello from Firebase function log 2!')
    response.send('Hello from Firebase 2!')
})

此控制台日志随后在部署时运行两次。

现在我了解到,无法了解Cloud Functions将为该函数启动多少个实例,如其文档所述:

  

函数文件中的全局范围(预期包含函数定义)在每次冷启动时执行,但是如果实例已经初始化,则不会执行。

如果添加第三个功能,则此控制台日志现在在日志中显示3次,而不是2次,每个功能一次。 说每个上载的函数都有一个新实例是正确的吗?我试图了解上载一组云函数时幕后发生的事情。

如果是这样-是否没有可靠的方法在云函数的全局函数中运行迁移代码?

1 个答案:

答案 0 :(得分:1)

您正在执行的操作不是Cloud Functions支持的用例。运行Cloud Functions代码以响应项目中发生的事件。部署时不会发生“一次性”功能调用。如果您需要一次运行代码,只需在台式机或您控制的其他服务器上运行代码即可。

您还应该努力最大程度地减少在函数的全局范围内发生的工作量。全局变量将被实例化并针对您应用中的每个功能运行一次,因为每个功能彼此完全隔离运行,并且每个功能都有自己的副本。观看有关function scaling and isolation的视频,以更好地了解这种行为。