我的云函数设置中有一个函数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