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

zek*_*210 17 localhost firebase typescript google-cloud-functions google-cloud-scheduler

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

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

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

我也没有使用谷歌云调度程序创建了这个,因为我只在 firebase 上。

JT5*_*501 36

解决方法

PubSub 模拟器尚不支持预定功能。

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

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

firebase functions:shell

firebase > setInterval(() => yourScheduledFunc(), 60000)
Run Code Online (Sandbox Code Playgroud)

不要退出,然后它将每60秒运行一次您的函数。

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


Arn*_*aag 17

实际上有一个 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
    })
});
Run Code Online (Sandbox Code Playgroud)

  • 您是部分正确的,因为它仅适用于通过主题创建的 pubsub - 而不是 OP 要求的预定的。 (11认同)
  • @GuilhermeMatuella 没关系。此解决方法在此处描述 /sf/answers/4603175811/ 和此处 https://github.com/firebase/firebase-tools/issues/2034 (2认同)

Dou*_*son 13

Firebase 本地模拟器目前无法模拟实际的预定功能。该文件说:

Firebase CLI 包含一个 Cloud Functions 模拟器,它可以模拟以下函数类型:

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

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

当您部署调度函数时,您实际上是在幕后使用 Google Cloud Scheduler。详情由您管理。如文档中所述:

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

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

  • 如果是的话,pubsub 模拟器有什么用? (6认同)

Fel*_*Dev 11

由于种种原因,重新运行firebase init对我不起作用。

我最终手动修改了 firebase.json 文件,

引用相关文档

通过运行 firebase init 模拟器或手动编辑 firebase.json 来更改模拟器端口。

// firebase.json
{
  "hosting": {
    // stuff...
  },
  "functions": {
    // stuff...
  },
  "emulators": {
    "functions": {
      "port": 5001
    },
    "hosting": {
      "port": 5000
    },
    "ui": {
      "enabled": true
    },
    "firestore": {
      "port": 8080
    },
    // * * * * * * * * *THIS * * * * * * * * * * * * * * * * * * * * * * * 
    "pubsub": {
      "port": "8085"
    }
    // * * * * * * * * *THIS * * * * * * * * * * * * * * * * * * * * * * * 
  },
  // more stuff...
}
Run Code Online (Sandbox Code Playgroud)