27

我正在为一个项目使用 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 上。

4

4 回答 4

24

实际上有一个 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
    })
});
于 2020-04-30T14:08:29.243 回答
19

Firebase 本地模拟器目前不模拟实际的预定功能。文档说:

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

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

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

当您部署计划功能时,您实际上是在幕后使用 Google Cloud Scheduler。为您管理详细信息。如文档中所述:

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

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

于 2020-04-16T15:20:20.523 回答
8

解决方法

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

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

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

firebase functions:shell

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

不要退出,它会每60秒运行一次你的函数。

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

于 2021-10-03T10:59:44.873 回答
3

由于原因,重新运行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...
}
于 2021-09-20T20:32:22.073 回答