Javascript 如何使用pubsub模拟器在本地调用firebase调度函数
我正在研究云函数,特别是调度函数。我需要每隔5分钟定期触发一个函数,但只在测试步骤中触发。我需要在pubsub emulator上运行它,而不部署它 怎么做 我试图使用firebase shell,但它只触发了一次Javascript 如何使用pubsub模拟器在本地调用firebase调度函数,javascript,firebase,google-cloud-functions,google-cloud-pubsub,Javascript,Firebase,Google Cloud Functions,Google Cloud Pubsub,我正在研究云函数,特别是调度函数。我需要每隔5分钟定期触发一个函数,但只在测试步骤中触发。我需要在pubsub emulator上运行它,而不部署它 怎么做 我试图使用firebase shell,但它只触发了一次 exports.scheduledFunctionPlainEnglish =functions.pubsub.schedule('every 2 minutes') .onRun((context) => { functions.logger.log("
exports.scheduledFunctionPlainEnglish =functions.pubsub.schedule('every 2 minutes')
.onRun((context) => {
functions.logger.log("this runs every 2 minutes")
return null;
})
计划功能当前不支持此操作。各国: 使用shell,您可以模拟数据并执行函数调用,以模拟与Emulator套件当前不支持的产品的交互:存储、PubSub、分析、远程配置、存储、身份验证和Crashlytics 计划函数是不受支持的pubsub触发器扩展
您可以随意使用。正如您所说,您可以使用firebase shell运行一次您的函数。 在firebase shell中,您可以使用NodeJS命令 使用设置间隔 在
firebase函数:shell
内部,使用setInterval
每2分钟运行一次函数
user@laptop:~$firebase函数:shell
✔ 函数:函数模拟器在启动http://localhost:5000
i函数:加载的函数:myScheduledFunction
firebase>setInterval(()=>myScheduledFunction(),120000)
>每2分钟一次
单行脚本
在Bash中,您甚至可以通过管道将setInterval
命令传递到firebase shell
user@laptop:~$echo“setInterval(()=>myScheduledFunction(),120000)”| firebase函数:shell
调度函数加载到云函数模拟器运行时,并绑定到PubSub模拟器主题
但正如@samstern所说的():
您必须使用发布/订阅消息手动触发它们
您可以这样做:
import*作为“firebase函数”中的函数;
从“firebase admin”导入*作为管理员;
从'@googlecloud/PubSub'导入{PubSub};
如果(!admin.apps.length){
admin.initializeApp();
}
const pubsub=新的pubsub({
apiEndpoint:'localhost:8085'//将其更改为您的PubSub仿真器地址和端口
});
设置间隔(()=>{
const SCHEDULED_FUNCTION_TOPIC='firebase schedule yourFunctionName';
log(`Trigger SCHEDULED function via PubSub-topic:${SCHEDULED\u function\u topic}`);
const msg=await publissub.topic(预定函数主题).publishJSON({
福:“酒吧”,
},{attr1:'value1'});
}, 5 * 60 * 1000); // 每5分钟
关于此概念的其他信息(感谢@kthaas):
自从firebase tools的8.4.3版以来,尤其是,此解决方案不再工作。为了完整起见,此代码段还有两个方面可以工作。首先,
PUBSUB\u EMULATOR\u HOST
env变量必须设置为类似于localhost:8432
(取决于您的本地仿真器设置)。其次,必须将项目id提供给PubSub构造函数(例如,new PubSub({projectId:''.''})
)@Stephan I向PubSub初始化添加了apidendpoint
。我没有指定projectId
而是使用env cmd
和.env
文件,其中包含指向默认凭证的链接GOOGLE\u应用程序\u凭证=。/default credentials.json
我之前怎么没有任何投票权?这很好用!我用从您的答案中借用的代码创建了一个js文件(而不是ts文件,这样就不用担心编译了),并手动触发任务,而不是像这样间隔:node functions/src/myTriggerfile.js
这是GitHub上的。