首页 > 解决方案 > 使用 Firebase 模拟器 PubSub 进行定时功能时出错

问题描述

我有一个定时云功能,我正在尝试在 Firebase 模拟器中进行测试。为此,我使用了此处描述的解决方案(如何使用 pubsub 模拟器在本地调用 firebase 调度函数),该解决方案使用 Pub/Sub 消息触发调度函数。

该解决方案成功触发了该功能,但它似乎重复调用的次数超出了预期。例如,当我运行下面的代码时,它应该每分钟调用一次预定函数:但是,它在一分钟后运行一次代码,然后在 2 分钟后运行两次(所以它总共运行了 3 次),然后在3 次(所以它总共运行了 6 次),并从那里继续增加它的调用,这表明 setInterval() 被多次调用(我的 Firebase index.js 文件中有 setInterval() )。有没有什么办法解决这一问题?非常感谢。

const pubsub = new PubSub({
  apiEndpoint: 'localhost:8085'
});

setInterval(() => {
  const SCHEDULED_FUNCTION_TOPIC = 'firebase-schedule-yourFunctionName';
  console.log(`Trigger sheduled function via PubSub topic: ${SCHEDULED_FUNCTION_TOPIC}`);
  const msg = await pubsub.topic(SCHEDULED_FUNCTION_TOPIC).publishJSON({
    foo: 'bar',
  }, { attr1: 'value1' });
}, 1 * 60 * 1000); // every 1 minute

标签: javascriptfirebasegoogle-cloud-functionsgoogle-cloud-pubsub

解决方案


我复制了你的案例,但我这边没有问题。这是我的完整源代码:

index.js

const admin = require("firebase-admin");
const functions = require("firebase-functions");
const { PubSub } = require("@google-cloud/pubsub");

const pubsub = new PubSub();
admin.initializeApp();

const date_ob = new Date();


exports.pubsubScheduled = functions.pubsub.schedule("every mon 07:00").onRun((context) => {
    console.log("========== PUBSUB FUNCTION ==========");
    console.log("Time", new Date());
    return true;
});

触发器.js

const admin = require("firebase-admin");
const functions = require("firebase-functions");
const { PubSub } = require("@google-cloud/pubsub");

admin.initializeApp();

var date_ob = new Date();
  
const pubsub = new PubSub({
 apiEndpoint: 'localhost:8085' // Change it to your PubSub emulator address and port
 });

  
    setInterval(() => {
    const SCHEDULED_FUNCTION_TOPIC = 'firebase-schedule-pubsubScheduled';
    console.log(`Trigger sheduled function via PubSub topic: ${SCHEDULED_FUNCTION_TOPIC} at ${new Date()}`);
    const msg =  pubsub.topic(SCHEDULED_FUNCTION_TOPIC).publishJSON({
      foo: 'bar',
    }, { attr1: 'value1' });
  }, 1 * 60 * 1000); // every 1 minute

运行模拟器后触发代码(trigger.js)没有问题,一切正常,没有出现多输出。您可以编辑您的问题并添加更多详细信息,以便我们如何重现您的问题。


推荐阅读