Firebase模拟器:如何模拟子文件夹中的特定Cloud Functions
如何在Firebase中仅模拟指定子文件夹的Cloud Functions
你的目录结构如下:
functions/ ├── firebase.json ├── function-one-folder/ │ └── index.js ├── function-two-folder/ │ └── index.js └── function-three-folder/ └── index.js
你尝试用firebase emulators:start --only functions:functionOne启动模拟器,但所有函数都被加载,以下是可行的解决方案:
方法1:确保命令指定的是函数的实际导出名称
Firebase模拟器的--only functions:<name>参数识别的是函数在主入口文件中导出的名称,而非文件夹名。
假设你的functions目录下有一个主index.js(如果没有,需要创建它作为Functions的入口),内容类似:
// 主index.js exports.functionOne = require('./function-one-folder'); exports.functionTwo = require('./function-two-folder'); exports.functionThree = require('./function-three-folder');
这里导出的函数名是functionOne、functionTwo,此时执行:
firebase emulators:start --only functions:functionOne
就能仅启动functionOne的模拟器。
如果命令里写的是文件夹名(比如function-one-folder)而非导出的函数名,模拟器会因为找不到匹配的函数而加载所有已注册的函数。
方法2:临时注释主入口中不需要的函数
如果只是临时测试单个函数,直接修改主index.js,注释掉其他函数的导出:
// 主index.js exports.functionOne = require('./function-one-folder'); // exports.functionTwo = require('./function-two-folder'); // exports.functionThree = require('./function-three-folder');
再执行firebase emulators:start --only functions即可,模拟器只会加载未被注释的函数。
方法3:用环境变量控制函数加载
如果需要更灵活的选择,可在主入口中通过环境变量判断是否导出某个函数:
// 主index.js const targetFunction = process.env.TARGET_FUNCTION; if (!targetFunction || targetFunction === 'functionOne') { exports.functionOne = require('./function-one-folder'); } if (!targetFunction || targetFunction === 'functionTwo') { exports.functionTwo = require('./function-two-folder'); } if (!targetFunction || targetFunction === 'functionThree') { exports.functionThree = require('./function-three-folder'); }
启动模拟器时指定环境变量:
TARGET_FUNCTION=functionOne firebase emulators:start --only functions
这样只会加载functionOne。
方法4:用单独的配置文件指定单个函数入口
创建针对单个函数的配置文件,比如firebase.functionOne.json:
{ "functions": { "source": ".", "main": "function-one-folder/index.js" }, "emulators": { "functions": { "port": 5001 } } }
然后用该配置启动模拟器:
firebase emulators:start --only functions --config firebase.functionOne.json
这种方式不需要修改主入口,直接指定单个子文件夹的index.js作为Functions的入口,模拟器只会加载该文件夹内的函数。
内容的提问来源于stack exchange,提问作者Shamil Jamion
相关产品推荐
相关产品推荐

