我有一个react应用,该应用必须在每个星期一@ 7:58 am每周执行一次任务。将该任务设置为单独的函数“ notification()”。我想使用NPM中的“ CRON”包在适当的时候调用notification()。
我将CRON包裹在这样的函数中:
let mondayNotif = () => {
new CronJob('* 58 7 * * 2', function() {
notification()
}, null, true, 'America/Los_Angeles');
};
我的问题:应该在哪里调用函数mondayNotif(),以确保正确启动了CronJob?我以为一开始它一定是在后端,但是NPM软件包似乎不支持服务器端。但是,如果我在客户端调用mondayNotif(),如果站点处于非活动状态,是否还会发生CronJob?
答案 0 :(得分:1)
据我所知,React JS是前端-它在客户端运行。您需要一台服务器。在这种情况下,基于node.js的服务器。从理论上讲,如果没有人打开网站,则在react js中不会触发任何内容。查找如何在node.js上安排cron作业
答案 1 :(得分:1)
现在,不要从客户端调用CronJob,因为如果有100个用户,则CronJob将被触发100次。您肯定需要在服务器端安装它
答案 2 :(得分:0)
我找到了自己的答案。但是首先,一些对CronJobs的见解会对我有所帮助:
CronJobs本质上是具有嵌入式时钟的第三方功能。一旦“启动”它们,您不必调用它们。第三方根据您在参数中安排的时间(即:“ 30 6 * * 5”)远程调用它们。
在不同的博客中,有关CRON时间存在一些差异。例如,一些博客坚持认为有6个时间变量,但我发现它可以使用5个时间变量。
CronJobs应该与主代码的主体位于单独的文件中,通常在文件夹结构的顶部,靠近“ package.json”和“ server.js”文件。
直接在cronjob.js文件中设置所有CronJob实用程序似乎是最干净的。例如:我直接在cronjob.js中使用了单独的数据库连接,并完全绕过了api路由。
CronJobs应该完全启动一次。有几种方法可以做到:package.json或server.js是最明显的选择。
这是我最后使用的文件结构:
-App
--package.json
--server.js
--cronjob.js
--/routes
--/src
--/models
--/public
...然后我将cronjob.js导入“ server.js”。这样,在“ dev”或“ build”期间加载server.js文件时,将启动cronjob函数一次。
作为参考,这是原始的 cronjob.js 文件(用于电子邮件通知):
const CronJob = require('cron').CronJob;
const Department = require('./models/department.js');
const template_remind = require('./config/remindEmailTemplate.js');
const SparkPost = require('sparkpost');
const client = new SparkPost('#############################');
const mongoose = require("mongoose");
const MONGODB_URI =
process.env.MONGODB_URI || "mongodb://localhost:27017/app";
mongoose.Promise = Promise;
// -------------------------- MongoDB -----------------------------
// Connect to the Mongo DB
mongoose.connect(MONGODB_URI, { useNewUrlParser: true }, (err, db) => {
if (err) {
console.log("Unable to connect to the mongoDB server. Error:", err);
} else {
console.log("Connection established to", MONGODB_URI);
}
});
const db = mongoose.connection;
// Show any mongoose errors
db.on("error", error => {
console.log("Mongoose Error: ", error);
});
// Once logged in to the db through mongoose, log a success message
db.once("open", () => {
console.log("Mongoose CRON connection successful.");
});
// ------------------------ Business Logic --------------------------
function weekday(notifications) {
Department.find({"active": true, "reminders": notifications, "week": {$lt: 13}}).distinct('participants', function(err, doc) {
if(err){
// console.log("The error: "+err)
} else {
console.log("received from database... "+JSON.stringify(doc))
for(let i=0; i<doc.length; i++){
client.transmissions.send({
recipients: [{address: doc[i]}],
content: {
from: 'name@sparkmail.email.com',
subject: 'Your email notification',
html: template_remind()
},
options: {sandbox: false}
}).then(data => {})
}
}
})
}
function weeklyNotif() {
new CronJob('45 7 * * 1', function() {weekday(1)}, null, true, 'America/New_York');
new CronJob('25 15 * * 3', function() {weekday(2)}, null, true, 'America/New_York');
new CronJob('15 11 * * 5', function() {weekday(3)}, null, true, 'America/New_York');
}
module.exports = weeklyNotif()
如您所见,我建立了唯一的数据库连接和电子邮件服务器连接(与我的API文件分开),并在该文件中运行了所有逻辑,然后导出了初始化函数。
这是 server.js 中出现的内容:
const cronjob = require("./cronjob.js");
您在这里要做的只是需要文件,并且由于该文件是作为函数导出的,因此会自动启动cronjob。
感谢您的阅读。如果您有反馈意见,请分享。