javascript - 使用 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
解决方案
我复制了你的案例,但我这边没有问题。这是我的完整源代码:
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
)没有问题,一切正常,没有出现多输出。您可以编辑您的问题并添加更多详细信息,以便我们如何重现您的问题。
推荐阅读
- java - 如何在我的类中为休眠验证链接注释
- php - Laravel 控制器中的语法错误检查
- bash - 如何将包含时间戳的列转换为 csv 文件中的纪元时间
- batch-file - 添加前导零以使每个文件名具有相同的长度
- javascript - VS2019 在保存或构建时编译 TS 的方式不同,我该如何解决这个问题?
- regex - 根据分隔符从字符串末尾选择字符串的一部分
- javascript - 如何从 pdf 文件生成器将文件下载到 Go 和 React 中的本地客户端
- laravel - 无法在 Laravel 中为模型类设置属性
- aws-api-gateway - 如何为新的 HTTP API 创建包含油门和配额限制的使用计划?
- html - 如何将runat服务器添加到cls文件