firebase 云计划功能无法正常工作

Posted

技术标签:

【中文标题】firebase 云计划功能无法正常工作【英文标题】:firebase cloud schedule function not working correct 【发布时间】:2021-09-13 15:22:57 【问题描述】:

我有 Firebase 云计划功能。它在前两个时期运行良好,但随后停止。我的功能代码如下。我对javascript没有经验。我的代码有错误吗?

const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp(functions.config().firebase);

const database = admin.database();

// kapandığı zamandan 30 dk sonra devreye gir.
exports.soloTurnuvaTetikleyici = functions.pubsub.schedule("every 360 minutes").onRun((context) => 
  const peryot = 360;
  turnuvaGuncelle(peryot, "solo");
  return null;
);


function turnuvaGuncelle(peryot, oyunTipi) 
  const kapaliKalmaZamani = Math.floor(Math.random() * 60) + 90; // min 90 dk max 150 dk
  const kapanistanSonraBekle = 30; // wait after finish
  const now = new Date().getTime();

  const acilisZamani = new Date(now + kapaliKalmaZamani * 60000).getTime(); // open date
  const kapanisZamani = new Date(now + (peryot - kapanistanSonraBekle) * 60000).getTime(); // close date

  const tarihler = 
    acilis: acilisZamani,
    kapanis: kapanisZamani,
  ;


  const diller = ["ar", "bj", "bn", "ca", "cs", "dz", "fr", "hr", "hu", "tr", "ch"];
  const ligler = ["1lig", "2lig", "3lig", "4lig", "5lig", "6lig", "7lig", "8lig", "9lig"];

  const ref = database.ref("/turnuvalar/");
  const updates = ;

  diller.forEach((dil) => 
    ligler.forEach((lig) => 
      updates[dil + "/" + lig + "/" + oyunTipi + "/info/"] = tarihler;
      updates[dil + "/" + lig + "/" + oyunTipi + "/matchmaking/"] = null;
    );
  );

  ref.update(updates);

我正在附上日志。 12:07:04.314 AM -> 工作正常

6:07:03,658 AM -> 工作正常

12:07:04.314 PM -> 不打电话

当前日期 -> 下午 5:14:38.060

它应该每 6 小时运行一次,但它不起作用。你觉得是什么原因?

【问题讨论】:

【参考方案1】:

您根本没有考虑您在 Cloud Function 中调用的 Firebase 方法的异步特性。我不知道这是否是您的问题的确切原因,但它总有一天会以一种难以调试的方式产生问题,因为它会以不稳定的方式出现,如下面解释。

正如您将在来自official Firebase video series 的三个有关“JavaScript Promises”的视频中看到的那样,当所有异步操作完成时,您必须在后台触发的 Cloud Function 中返回一个 Promise 或一个值。这向平台表明它已经完成,它避免了云函数在异步操作完成之前被终止。

在您的情况下,您不必等待异步turnuvaGuncelle() 函数完成后再执行return null;。这向 Cloud Function 平台表明它可以终止并清理您的函数,而无需等待异步 turnuvaGuncelle() 函数完成。

这可能会导致一些不稳定的行为,因为有时会发生您的 Cloud Function 在异步更新操作完成之前终止,但有些时候 Cloud Function 平台不会立即终止 Function 并且可以完成异步操作.

您需要按如下方式调整您的代码(我们使用async/await):

// kapandığı zamandan 30 dk sonra devreye gir.
exports.soloTurnuvaTetikleyici = functions.pubsub.schedule("every 360 minutes").onRun(async (context) => 
    const peryot = 360;
    await turnuvaGuncelle(peryot, "solo");
    return null;
);


async function turnuvaGuncelle(peryot, oyunTipi) 
    const kapaliKalmaZamani = Math.floor(Math.random() * 60) + 90; // min 90 dk max 150 dk
    const kapanistanSonraBekle = 30; // wait after finish
    const now = new Date().getTime();

    const acilisZamani = new Date(now + kapaliKalmaZamani * 60000).getTime(); // open date
    const kapanisZamani = new Date(now + (peryot - kapanistanSonraBekle) * 60000).getTime(); // close date

    const tarihler = 
        acilis: acilisZamani,
        kapanis: kapanisZamani,
    ;

    const diller = ["ar", "bj", "bn", "ca", "cs", "dz", "fr", "hr", "hu", "tr", "ch"];
    const ligler = ["1lig", "2lig", "3lig", "4lig", "5lig", "6lig", "7lig", "8lig", "9lig"];

    const ref = database.ref("/turnuvalar/");
    const updates = ;

    diller.forEach((dil) => 
        ligler.forEach((lig) => 
            updates[dil + "/" + lig + "/" + oyunTipi + "/info/"] = tarihler;
            updates[dil + "/" + lig + "/" + oyunTipi + "/matchmaking/"] = null;
        );
    );

    await ref.update(updates);

【讨论】:

非常感谢您提供的信息(异步/等待)。这是非常重要的一点。我添加了您对我的代码所做的更改。非常感谢

以上是关于firebase 云计划功能无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 云功能无法正确记录

IOS 应用程序中的 Firebase 云消息传递 (FCM) 无法正常工作

Firebase 云函数中的 Object.values()

Firebase 云消息传递:我们无法注册默认服务工作者错误

为啥我的用于 Firebase 的 Cron 计划云功能在太平洋时间而不是 UTC 时间运行?

Firebase 电子邮件验证无法正常工作