首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用firebase仿真器pubsub在本地测试定时函数?

如何使用firebase仿真器pubsub在本地测试定时函数?
EN

Stack Overflow用户
提问于 2020-04-16 15:14:42
回答 4查看 17.3K关注 0票数 36

我正在为一个项目使用firebase,并且正在使用下面的代码创建一个调度函数。我想每一分钟都记录一条信息。

代码语言:javascript
复制
export const timedQuery = functions.pubsub.schedule('1 * * * *').onRun((context) => {
console.log("I am running")
return null;
})

我有在http函数下工作的代码的主要逻辑,并且希望在部署到生产之前看看这在本地是否有效。通过查看firebase文档,我下载了所有的firebase模拟器,并使用"firebase模拟器:start“来运行它们。从日志中看,看起来我的pubsub仿真器在localhost上成功启动:8085,并且pubsub函数被初始化,但是即使在等待2-3分钟之后,也没有输出任何输出。是否可以在本地测试预定的函数?

而且,我创建这个程序时没有使用google云调度器,因为我只是在防火墙上。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-04-16 15:20:20

Firebase本地模拟器目前并不模拟实际的计划函数。文档说:

Firebase CLI包括一个云函数仿真器,它可以模拟以下函数类型:

  • HTTPS函数
  • 可调用函数
  • 云修复功能

我建议向火力支援提交一个特性请求。

部署计划函数时,实际上是在幕后使用。细节是为您管理的。如文档所述

如果您想安排函数在指定时间运行,请使用functions.pubsub.schedule().onRun()这个方便的方法创建一个Google /Sub主题,并使用Google触发该主题上的事件,确保您的函数按照所需的时间表运行。

我建议将函数的代码重构为可以通过直接使用您选择的测试框架调用它来测试的方法。您还可以将其临时包装在HTTP函数中,并以这种方式调用它。

票数 23
EN

Stack Overflow用户

发布于 2020-04-30 14:08:29

实际上,有一个Firebase PubSub模拟器。要启用它,您需要安装最近的CLI (它肯定在8.2.0中)

  • 重新运行Firebase Init
  • 选择仿真器(空格)
  • 选择PubSub (和您希望的其他人)
  • 配置所需的dev端口
  • 让CLI安装模拟器

在本地创建一个测试脚本,将PubSub消息提交到队列中:

代码语言:javascript
复制
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

const { PubSub } = require('@google-cloud/pubsub');
const pubsub = new PubSub();

exports.pubsubWriter = functions.https.onRequest(async (req, res) => {
    console.log("Pubsub Emulator:", process.env.PUBSUB_EMULATOR_HOST);

    const msg = await pubsub.topic('test-topic').publishJSON({
        foo: 'bar',
        date: new Date()
    }, { attr1: 'value' });

    res.json({
        published: msg
    })
});
票数 25
EN

Stack Overflow用户

发布于 2021-10-03 10:59:44

解决办法

PubSub模拟器仍然不支持预定的函数。

但是您可以使用firebase functions:shellsetInterval来模拟调度程序。

备注:请确保您正在本地运行firebase模拟器,否则shell可能会调用Production中的函数!

代码语言:javascript
复制
firebase functions:shell

firebase > setInterval(() => yourScheduledFunc(), 60000)

不要退出,它将每隔60运行一次函数。

注意到:在shell中运行的函数不会显示在模拟器的日志中。

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61253788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档