如何解决节点调度模块无法长时间调度作业
我使用 node-schedule module 来 cron 一个在特定时间只执行一次的作业。我还使用 callable function 来触发 Cloud Function 并获取客户端数据。最大的问题是所有事情都可以将单个任务 cron 到 15 分钟。但是,另一方面,它不会执行超过 15 分钟的预定时间。取消任务 15 分钟后可能会发生什么?我使用了 Firebase Quickstart code 并且我只在代码中添加了 schedule-job 模块。除了从客户端获取调度时间值之外,我没有改变任何东西。我真的需要这个问题的帮助。云函数脚本如下。
谢谢。
/* eslint-disable max-len */
"use strict";
const functions = require("firebase-functions");
const sanitizer = require("./sanitizer");
const admin = require("firebase-admin");
const schedule = require("node-schedule");
admin.initializeApp();
// [START messageFunctionTrigger]
// Saves a message to the Firebase Realtime Database but sanitizes the text by removing swearwords.
exports.addMessage = functions.https.onCall((data,context) => {
// [START_EXCLUDE]
// [START readMessageData]
// Message text passed from the client.
const text = data.text;
// [END readMessageData]
// [START messageHttpsErrors]
// Checking attribute.
if (!(typeof text === "string") || text.length === 0) {
// Throwing an HttpsError so that the client gets the error details.
throw new functions.https.HttpsError("invalid-argument","The function must be called with " +
"one arguments \"text\" containing the message text to add.");
}
// Checking that the user is authenticated.
if (!context.auth) {
// Throwing an HttpsError so that the client gets the error details.
throw new functions.https.HttpsError("failed-precondition","The function must be called " +
"while authenticated.");
}
// [END messageHttpsErrors]
// [START authIntegration]
// Authentication / user information is automatically added to the request.
const uid = context.auth.uid;
const name = context.auth.token.name || null;
const picture = context.auth.token.picture || null;
const email = context.auth.token.email || null;
// [END authIntegration]
// [START returnMessageAsync]
// Saving the new message to the Realtime Database.
const dateWithTimeZone = (timeZone,year,month,day,hour,minute,second) => {
const date = new Date(Date.UTC(year,second));
const utcDate = new Date(date.toLocaleString("en-US",{timeZone: "UTC"}));
const tzDate = new Date(date.toLocaleString("en-US",{timeZone: timeZone}));
const offset = utcDate.getTime() - tzDate.getTime();
date.setTime( date.getTime() + offset );
return date;
};
const sanitizedMessage = sanitizer.sanitizeText(text); // Sanitize the message.
const dataFuture = [uid,name,picture,email,sanitizedMessage];
new Promise(function() {
schedule.scheduleJob(dateWithTimeZone("Europe/Istanbul",data.year,data.month,data.day,data.hour,data.minute,data.second),function(data) {
const theuid = data[0];
const thename = data[1];
const thepicture = data[2];
const theemail = data[3];
return admin.database().ref("/messages").push({
text: data[4],author: {theuid,thename,thepicture,theemail},}).then(() => {
console.log("New Message written");
// Returning the sanitized message to the client.
return {text: data[4]};
})
// [END returnMessageAsync]
.catch((error) => {
// Re-throwing the error as an HttpsError so that the client gets the error details.
throw new functions.https.HttpsError("unknown",error.message,error);
});
}.bind(null,dataFuture));
// [END_EXCLUDE]
});
return {text: "done"};
// [END messageFunctionTrigger]
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。