![](/img/trans.png)
[英]Firebase Functions work in firebase deployment, but not locally
[英]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 中)
在本地創建一個測試腳本,將 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:shell
和setInterval
來模擬調度程序。
注意:請確保您在本地運行 firebase 仿真器,否則 shell 可能會調用生產中的功能!
firebase functions:shell
firebase > setInterval(() => yourScheduledFunc(), 60000)
不要退出,然后它將每60秒運行一次你的函數。
注意:在 shell 中運行的函數不會顯示在模擬器的日志中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.