云函数 - 使用全局变量



我的云函数设置中有一个函数cloudFunctionCall,每次云函数调用都会调用该函数。

import * as functions from "firebase-functions";
const mysql = require("mysql");
function cloudFunctionCall(asyncFunc) {
return functions
.region(region)
.https.onCall(async (data: any, context: any) => {
try {
const pool = mysql.createPool(getConfig(context));
const result = await asyncFunc(data, pool);
pool.end();
res.send(result);
} catch (err) {
log("A promise failed to resolve", err);
res.status(500).send(err);
}
});
}
export const func1 = cloudFunctionCall(_func1);
export const func2 = cloudFunctionCall(_func2);

context,因此pool定义了调用的函数需要与哪个数据库通信,该数据库在每次云函数调用时都可能会更改。现在我想避免将pool作为参数传递给asyncFunc,因为它实际上不是函数逻辑所必需的,并且使函数更加冗长。

现在我的问题:将pool定义为在每次云函数调用时都会更新的全局变量是否安全,如下所示?

//...
let pool;
function cloudFunctionCall(asyncFunc) {
return functions
.region(region)
.https.onCall(async (data: any, context: any) => {
try {
pool = mysql.createPool(getConfig(context));
const result = await asyncFunc(data, pool);
//...

我知道每个导出的函数都托管在它自己的环境中,但是如果func1在不同的数据库上快速连续执行两次会发生什么?第二次调用是否会覆盖第一个调用设置的pool,以便后一个调用在错误的数据库上执行?

如果是这样,有没有另一种方法可以避免将pool作为参数传递?

云函数调用彼此严格隔离:每个容器一次只能执行一次。因此,函数调用不可能相互覆盖全局值。

全局变量值在同一实例的所有函数调用中共享:

https://cloud.google.com/functions/docs/samples/functions-tips-scopes

因此,函数调用不是孤立的全局变量。

在谷歌文档中,当他们声明"隔离"时,他们的意思只是实例,而不是函数调用。

另请参阅1:27:

https://www.youtube.com/watch?v=2mjfI0FYP7Y&list=PLl-K7zZEsYLm9A9rcHb1IkyQUu6QwbjdM&index=1

相关内容

  • 没有找到相关文章

最新更新