firebase 云计划功能无法正常工作
firebase cloud schedule function not working correct
我有 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 下午 -> 未致电
当前日期 -> 5:14:38.060 PM
它应该每 6 小时 运行,但它不起作用。你认为是什么原因?
您根本没有考虑到您在 Cloud Function 中调用的 Firebase 方法的异步特性。我不知道这是否是您问题的确切原因,但它有一天会以一种难以调试的方式产生问题,因为它会以 不稳定 的形式出现方式,如下所述。
正如您将在 official Firebase video series 中有关“JavaScript Promises”的三个视频中看到的那样,您必须 return 当所有异步操作完成。这向平台表明它已完成,并且避免了 Cloud Function 在异步操作完成之前终止。
在您的情况下,您无需等待异步 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 云计划功能。它在前两个时期工作正常,但随后停止。我的功能代码如下。我在 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 下午 -> 未致电
当前日期 -> 5:14:38.060 PM
它应该每 6 小时 运行,但它不起作用。你认为是什么原因?
您根本没有考虑到您在 Cloud Function 中调用的 Firebase 方法的异步特性。我不知道这是否是您问题的确切原因,但它有一天会以一种难以调试的方式产生问题,因为它会以 不稳定 的形式出现方式,如下所述。
正如您将在 official Firebase video series 中有关“JavaScript Promises”的三个视频中看到的那样,您必须 return 当所有异步操作完成。这向平台表明它已完成,并且避免了 Cloud Function 在异步操作完成之前终止。
在您的情况下,您无需等待异步 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);
}