无法找出在React App中在何处启动CronJob

时间:2019-11-09 20:35:56

标签: reactjs cron notifications create-react-app

我有一个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?

3 个答案:

答案 0 :(得分:1)

据我所知,React JS是前端-它在客户端运行。您需要一台服务器。在这种情况下,基于node.js的服务器。从理论上讲,如果没有人打开网站,则在react js中不会触发任何内容。查找如何在node.js上安排cron作业

enter link description here

答案 1 :(得分:1)

现在,不要从客户端调用CronJob,因为如果有100个用户,则CronJob将被触发100次。您肯定需要在服务器端安装它

答案 2 :(得分:0)

我找到了自己的答案。但是首先,一些对CronJobs的见解会对我有所帮助:

  1. CronJobs本质上是具有嵌入式时钟的第三方功能。一旦“启动”它们,您不必调用它们。第三方根据您在参数中安排的时间(即:“ 30 6 * * 5”)远程调用它们。

  2. 在不同的博客中,有关CRON时间存在一些差异。例如,一些博客坚持认为有6个时间变量,但我发现它可以使用5个时间变量。

  3. CronJobs应该与主代码的主体位于单独的文件中,通常在文件夹结构的顶部,靠近“ package.json”和“ server.js”文件。

  4. 直接在cronjob.js文件中设置所有CronJob实用程序似乎是最干净的。例如:我直接在cronjob.js中使用了单独的数据库连接,并完全绕过了api路由。

  5. 在应用程序启动之初,
  6. 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。

感谢您的阅读。如果您有反馈意见,请分享。