Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用pubsub模拟器在本地调用firebase调度函数_Javascript_Firebase_Google Cloud Functions_Google Cloud Pubsub - Fatal编程技术网

Javascript 如何使用pubsub模拟器在本地调用firebase调度函数

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("

我正在研究云函数,特别是调度函数。我需要每隔5分钟定期触发一个函数,但只在测试步骤中触发。我需要在pubsub emulator上运行它,而不部署它

怎么做

我试图使用firebase shell,但它只触发了一次

 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上的。