簡體   English   中英

如何使用 firebase 模擬器 pubsub 在本地測試定時功能?

[英]How to use firebase emulators pubsub to test timed functions locally?

我正在將 firebase 用於項目,並且正在使用以下代碼創建計划 function。 我想每運行一分鍾記錄一條消息。

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

我有在 http function 下工作的代碼的主要邏輯,並且想在部署到生產之前看看這是否在本地工作。 通過 firebase 文檔,我下載了所有 firebase 仿真器並使用“firebase emulators:start”讓它們運行。 從日志來看,我的 pubsub 模擬器似乎在 localhost:8085 成功啟動,並且 pubsub function 已初始化,但是即使等待 2-3 分鍾后也沒有打印出來。 是否可以在本地測試預定功能?

此外,我在沒有使用谷歌雲調度程序的情況下創建了這個,因為我只在 firebase 上。

實際上有一個 Firebase PubSub 模擬器。 要啟用它,您需要安裝最近的 CLI(它肯定在 8.2.0 中)

  • 重新運行 Firebase 初始化
  • Select 仿真器(空格鍵)
  • Select 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
    })
});

Firebase 本地仿真器當前不模擬實際的預定功能。 文檔說:

Firebase CLI 包括一個 Cloud Functions 模擬器,它可以模擬以下 function 類型:

  • HTTPS 功能
  • 可調用函數
  • Cloud Firestore 功能

我建議使用Firebase support提交功能請求。

當您部署計划的 function 時,您實際上是在幕后使用 Google Cloud Scheduler。 為您管理詳細信息。 文檔中所述:

如果您想安排函數在指定時間運行,請使用 functions.pubsub.schedule().onRun() 此便捷方法創建 Google Cloud Pub/Sub 主題並使用 Google Cloud Scheduler 觸發該主題上的事件,確保您的function 按所需的時間表運行。

我建議將您的函數代碼重構為一種方法,您可以通過使用您選擇的測試框架直接調用它來進行測試。 您也可以暫時將其包裝在 HTTP function 中並以這種方式調用它。

由於原因,重新運行firebase init對我不起作用。

我最終手動修改了 firebase.json 文件,

引用相關文檔

通過運行 firebase 初始化模擬器或手動編輯 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...
}

解決方法

PubSub 模擬器仍然不支持預定功能。

但是您可以使用firebase functions:shellsetInterval來模擬調度程序。

注意:請確保您在本地運行 firebase 仿真器,否則 shell 可能會調用生產中的功能!

firebase functions:shell

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

不要退出,然后它將每60秒運行一次你的函數。

注意:在 shell 中運行的函數不會顯示在模擬器的日志中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM