如何使用Firebase模拟器pubsub在本地测试定时功能?

时间:2020-04-16 15:14:42

标签: typescript firebase google-cloud-functions localhost google-cloud-scheduler

我正在为项目使用Firebase,并且正在使用以下代码来创建计划功能。我想在运行的每一分钟记录一条消息。

export const timedQuery = functions.pubsub.schedule('1 * * * *').onRun((context) => {
console.log("I am running")
return null;
})

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

我也是在Firebase上,因此我没有使用Google Cloud Scheduler就创建了它。

2 个答案:

答案 0 :(得分:7)

Firebase本地模拟器当前不模拟实际的预定功能。 documentation说:

Firebase CLI包括一个可以模拟的Cloud Functions模拟器 以下功能类型:

  • HTTPS函数
  • 可调用函数
  • Cloud Firestore功能

我建议向Firebase support提交功能请求。

部署预定功能时,实际上是在后台使用Google Cloud Scheduler。详细信息由您管理。如documentation中所述:

如果您要安排函数在指定时间运行,请使用functions.pubsub.schedule()。onRun()这种便捷的方法可以创建Google Cloud Pub / Sub主题,并使用Google Cloud Scheduler触发有关该主题的事件,确保您的功能按预期的时间表运行。

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

答案 1 :(得分:4)

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

  • 重新运行Firebase初始化
  • 选择仿真器(空格键)
  • 选择PubSub(以及您希望的其他人)
  • 配置所需的开发人员端口
  • 让CLI安装仿真器

在本地创建测试脚本以将PubSub消息提交到队列中

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
    })
});