web-dev-qa-db-ja.com

Firebaseエミュレーターpubsubを使用して時間制限機能をローカルでテストする方法

プロジェクトにfirebaseを使用しており、次のコードを使用してスケジュール関数を作成しています。これが実行される毎分メッセージを記録したいと思います。

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

Http関数の下で動作するコードのメインロジックがあり、本番環境にデプロイする前にこれがローカルで機能するかどうかを確認したいと思います。 firebase docsを確認するすべてのfirebaseエミュレーターをダウンロードし、「firebase emulators:start」を使用して実行しました。ログから、私のpubsubエミュレータはlocalhost:8085で正常に起動し、pubsub関数が初期化されているように見えますが、2〜3分待っても何も出力されません。ローカルでスケジュールされた機能をテストすることは可能ですか?

また、firebaseを使用しているので、Googleクラウドスケジューラを使用せずにこれを作成しました。

3
zeke13210

実際にはFirebase PubSubエミュレータがあります。これを有効にするには、最新のCLIをインストールする必要があります(確かに8.2.0にあります)。

  • Firebase Initを再実行します
  • エミュレーターを選択(スペースバー)
  • 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
    })
});
2
Arno Zwaag